Код выхода счетчика 139 при запуске, но gdb выполняет его

Мой вопрос звучит специфично, но я сомневаюсь, что он все еще может быть проблемой отладки С++.

Я использую omnet ++, который должен имитировать беспроводную сеть. Сам omnet ++ является программой на С++.

Я столкнулся с странным явлением, когда запускаю свою программу (модифицированная инфраструктура inet с omnet ++ 4.2.2 в Ubuntu 12.04): выход программы с кодом выхода 139 (говорят, что это означает фрагментацию памяти) при касании определенной части кодов, когда я пытаюсь отлаживать, gdb не сообщает ничего плохого в "проблемных" кодах, где симуляция завершается ранее, на самом деле, отладка проходит через эту часть кодов и выводит ожидаемые результаты.

Информация о версии gdb: GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04

Может ли кто-нибудь сказать мне, почему сбой выполняется, но отладка не работает?

Большое спасибо!

Ответ 1

код выхода 139 (говорят, что это означает фрагментацию памяти)

Нет, это означает, что ваша программа умерла с сигналом 11 (SIGSEGV в Linux и большинстве других UNIX), также известном как segmentation fault.

Может ли кто-нибудь сказать мне, почему сбой выполняется, но отладка не работает?

Ваша программа демонстрирует поведение undefined и может делать что-нибудь (что иногда включает в себя работу, чтобы работать исправно).

Ваш первый шаг должен запускать эту программу под Valgrind и исправлять все сообщения об ошибках.

Если после выполнения вышеописанной программы все еще происходит сбой, тогда вы должны позволить ему выгрузить ядро ​​(ulimit -c unlimited; ./a.out), а затем проанализировать этот дамп ядра с помощью GDB: gdb ./a.out core; затем используйте команду where.

Ответ 2

эта ошибка также вызвана нулевой ссылкой на указатель. если вы используете указатель, который не инициализирован, то это вызывает эту ошибку.

чтобы проверить, инициализирован ли указатель или нет, вы можете попробовать что-то вроде

Class *pointer = new Class();
if(pointer!=nullptr){
    pointer->myFunction();
}