Сегодня, к своему ужасу, я осознал, что моя программа моделирования на C ++ вылетела после 12 дней работы, всего за несколько строк до ее завершения, в результате чего у меня не осталось ничего, кроме (усеченного) дампа ядра.
Анализ дампа ядра с помощью gdb показал, что
Программа завершена сигналом SIGBUS, Ошибка шины.
и что сбой произошел в следующей строке моего кода:
seconds = std::difftime(stopTime, startTime); // seconds is of type double
Переменные stopTime
и startTime
относятся к типу std::time_t
, и мне удалось извлечь их значения во время сбоя из дампа ядра:
startTime: 1426863332
stopTime: 1427977226
Трассировка стека над вызовом difftime выглядит так:
#0 0x.. in _dl_fixup () from /lib64/ld-linux-x86-64.so.2
#1 0x.. in _dl_runtime_resolve () from /lib64/ld-linux-x86-64.so.2
Я написал небольшую программу для воспроизведения ошибки, но безуспешно. Простой вызов std::difftime(stopTime, startTime)
с указанными выше значениями не вызывает сбоя SIGBUS. Конечно, я не хочу, чтобы это повторилось снова. Я уже несколько раз успешно выполнял одну и ту же программу (хотя и с разными аргументами) со сравнимым временем выполнения. Что может вызвать эту проблему и как я могу предотвратить ее в будущем?
Вот дополнительная информация о системе.
GCC: (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
Linux Kernel: 3.11.10-25-desktop, x86_64
C++ standard library: 6.0.18
Изменить
Вот еще один контекст. Во-первых, полная трассировка стека (многоточие [..]
у меня):
#0 0x00007f309a4a5bca in _dl_fixup () from /lib64/ld-linux-x86-64.so.2
#1 0x00007f309a4ac195 in _dl_runtime_resolve () from /lib64/ld-linux-x86-64.so.2
#2 0x0000000000465453 in CStopwatch::getTime (this=0x7fff0db48c60, delimiterHourMinuteSecondsBy="") at [..] CStopwatch.cpp:86
#3 0x00000000004652a9 in CStopwatch::stop (this=0x7fff0db48c60) at [..] CStopwatch.cpp:51
#4 0x0000000000479a0c in main (argc=33, argv=0x7fff0db499c8) at [..] coherent_ofdm_tsync_mse.cpp:998
Проблема возникает в объекте класса CStopwatch
, который создается в начале программы. Секундомер запускается в main () на самом верху. После завершения моделирования вызывается функция CStopwatch::stop( )
.
Конструктор класса секундомера:
/*
* Initialize start and stop time on construction
*/
CStopwatch::CStopwatch()
{
this->startTime = std::time_t( 0 );
this->stopTime = std::time_t( 0 );
this->isRunning = false;
}
Функция CStopwatch::stop( )
/*
* Stop the timer and return the elapsed time as a string
*/
std::string CStopwatch::stop( )
{
if ( this->isRunning ) {
this->stopTime = std::time( 0 );
}
this->isRunning = false;
return getTime( );
}
Функция CStopwatch::getTime()
/*
* Return the elapsed time as a string
*/
std::string CStopwatch::getTime( std::string delimiterHourMinuteSecondsBy )
{
std::ostringstream timeString;
// ...some string init
// time in seconds
double seconds;
if ( this->isRunning ){
// return instantaneous time
seconds = std::difftime(time(0), startTime);
} else {
// return stopped time
seconds = std::difftime(stopTime, startTime); // <-- line where the
// program crashed
}
// ..convert seconds into a string
return timeString.str( );
}
В начале программы вызывается CStopwatch::start( )
/*
* Start the timer, if watch is already running, this is effectively a reset
*/
void CStopwatch::start( )
{
this->startTime = std::time( 0 );
this->isRunning = true;
}
seconds
переменная-член? Если да, то какое тогда значениеthis
? Это указатель на действительный объект? Когда и где вы вызываете функцию? Не могли бы вы показать еще контекст? - person Some programmer dude   schedule 02.04.2015#2
- это строка кода, которую я предоставил, а остальное - это некоторые вызовы внутри моего исходного кода, которые, я думаю, не могут быть поняты без (большого) контекста. - person Deve   schedule 02.04.2015