ошибка сегментации, вызванная тестами, работающими под CppUnit

Сегодня я обнаружил, что в одном из моих тестов используется какой-то код/библиотека, которая segfaults. Я работаю в среде Linux на C++ и CppUnit.

Есть ли какая-либо функция в CppUnit для проверки на segfault и сообщения об этом как о сбое для конкретного тестового случая?

В CppUnit я могу даже проверять исключения, но я думаю, что то, что я прошу, может быть слишком много! Единственное, что я нашел, это раздел Как распечатать отладочную информацию на этой странице здесь.

Я думал запустить исполняемый файл CppUnit из скрипта на pyhon или perl, а затем проверить, производится ли ядро. Знаете ли вы лучший способ добиться того, чего я хочу?


person Abruzzo Forte e Gentile    schedule 22.12.2010    source источник
comment
Добавлен тег unix - SEGFAULT не является общим.   -  person Edward Strange    schedule 22.12.2010
comment
Всем привет. Спасибо всем за ваши ответы. В конце концов я решил запустить тест с помощью GDB в пакетном режиме. Это немного медленнее, но, по крайней мере, в случае ошибок сегментации, он зарегистрирует точную точку кода [ файл/строка ], где возникла проблема. Для этого я использую следующую команду: gdb ./testApp -ex set args ./testClient.cfg -ex r --batch   -  person Abruzzo Forte e Gentile    schedule 23.12.2010


Ответы (2)


Сбой seg приведет к ненулевому статусу выхода из вашего теста (на Solaris, я думаю, это 139). Можете ли вы проверить это из любого метода, используемого для вызова вашего модульного теста?

person Mark B    schedule 22.12.2010
comment
Привет. Спасибо за ответ.. наверное, я просил невозможного... но в Linux, насколько я помню, такой же код, так что я мог бы проверить. - person Abruzzo Forte e Gentile; 23.12.2010

«Есть ли какая-либо функция в CppUnit для проверки на segfault и сообщения об этом как о сбое для конкретного тестового примера?»

Неа. Segfault — это нарушение уровня ОС, и вам не разрешено его отлавливать. Даже если вы попытаетесь (используя signal() iirc), вы ничего не сможете сделать с тем, чтобы быть убитым ОС.

Вам нужно выполнить тестовую программу с помощью отладчика.

person Edward Strange    schedule 22.12.2010
comment
Хм, cppunit может вызвать sigaction и обработать SIGSEGV и сообщить об этом как об ошибке. - person bmargulies; 22.12.2010