Дамп ядра не синхронизирован с трассировкой стека GDB - PullRequest
3 голосов
/ 06 сентября 2010

У меня есть программа, которая падает из-за ошибки сегментации. Файл ядра создается.

Запуск ядра в GDB дает мне следующее:

HP GDB 6,1 для HP Itanium (32 или 64 бит) и целевой HP-UX 11iv2 и 11iv3.

Ядро сгенерировано `gcpf1fwcApp '.
Программа прервана с сигналом 6, Прервано.

Я использовал команду

нить применить все BT

Когда я проверяю трассировку стека, я получаю сообщение об ошибке в главном потоке, который находится в состоянии ожидания.

Однако когда я запускаю ту же программу в GDB, я получаю совершенно другую ошибку в трассировке стека. Что кажется более правильным, чем дамп ядра.

В программе 31 поток.

Почему я получаю такую ​​разницу?

1 Ответ

3 голосов
/ 07 сентября 2010

Возможно, вы просто смотрите не на ту нить.

Попробуйте thread apply all where и посмотрите, действительно ли один из потоков abort() ing.

При отладке живого процесса GDB остановится, когда поток получит SIGABRT, и, вероятно, покажет вам соответствующий поток.

При отладке ядра (посмертно) GDB не знает, какой поток является релевантным, и поэтому показывает их вам в любом порядке, в котором ОС сохранила их в ядре. Ядра Linux сохраняют поток, который первым вызвал процесс, поэтому GDB в Linux показывает соответствующий поток из ядра. Я предполагаю, что HP-UX этого не делает, и поэтому GDB показывает вам «случайный» поток.

...