Программа C++ неожиданно завершает работу, как мне отладить это с помощью gdb?

Я пишу программу, которая выполняет некоторые модульные тесты кода, написанного моими коллегами. Я использую Google C++ Testing Framework. Я запускаю функцию, которая порождает 3 потока, а затем работает в течение 30 секунд. После запуска программа завершается со статусом 0. Очевидно, это не ожидаемое поведение. Я знаю, что это не продвинется дальше, потому что я поместил оператор cout в следующую строку.

Мой вопрос: как лучше всего отладить это с помощью gdb? Это сложно, потому что программа не segfault или что-то в этом роде, она просто завершает работу. Есть ли способ перехватить выходной вызов, а затем получить длинную обратную трассировку?

Спасибо за помощь.

Редактировать:

cSystemCfg* pSystemCfg = new cSystemCfg();
std::cout << "Before runThing" << std::endl;
pSomething->runThing(&acq, pHwIf, pSystemCfg, pIf);
//Exits here, never gets to the next line
std::cout << "After runThing" << std::endl;

person xxpor    schedule 30.09.2010    source источник
comment
Вы уверены, что код выхода 0 является ошибкой?   -  person John Dibling    schedule 30.09.2010
comment
Можете ли вы опубликовать свой код? Помочь было бы проще.   -  person Loïc Février    schedule 30.09.2010
comment
почему точно не ожидается выхода с 0? Вы имеете в виду, что программа не выходит из своей основной с 0? В этом случае где-то вызывается exit( 0 ). Я бы сказал, поставьте там точку останова.   -  person stijn    schedule 30.09.2010
comment
В этот момент вообще не ожидается выхода.   -  person xxpor    schedule 30.09.2010
comment
Я хотел бы уточнить, я мог бы поставить точку останова, но это было бы утомительно. В итоге функция вызывает более 5000 строк кода.   -  person xxpor    schedule 30.09.2010
comment
@stijn: //Exits here, never gets to the next line   -  person sbi    schedule 30.09.2010
comment
Отладка — это навык, которым не многие хотят пользоваться, почему это так?   -  person DumbCoder    schedule 30.09.2010


Ответы (2)


Помимо break exit, есть еще несколько мест, где вам может понадобиться установить точки останова. Взгляните на этот вопрос и ответы.

person SCFrench    schedule 30.09.2010
comment
Спасибо за эту ссылку; это очень помогло. Оказывается, моя программа выполняет все, сразу после этого вызова функции ничего не выводится на экран. - person xxpor; 30.09.2010

Простая команда break exit в gdb должна остановить программу и позволить вам проверить состояние, когда программа вызывает exit из любого потока.

Это, конечно, предполагает, что программа завершается из-за вызова exit, а не по какой-либо другой причине, такой как abort, ошибка утверждения, необработанное исключение или возврат из main.

person Tyler McHenry    schedule 30.09.2010
comment
должен сделать это нужно. В противном случае найдите вызовы exit () и т. Д. И поставьте там точку останова, но я думаю, в этом весь смысл выхода gdb из паузы, не так ли? - person stijn; 30.09.2010
comment
Я только что попробовал это, и он все еще позволяет потокам выходить. Я попробовал выполнить обратный шаг, и он говорит: Целевая многопоточность не поддерживает эту команду. - person xxpor; 30.09.2010
comment
Если он не прерывается на exit, когда вы говорите break exit, то exit не является причиной выхода вашей программы. Попробуйте разбить abort или catch throw, чтобы остановить выброшенные исключения, или выяснить, получает ли ваша программа сигнал, который вызывает ее завершение. - person Tyler McHenry; 30.09.2010