Дамп ядра не синхронизирован с трассировкой стека GDB
-
01-10-2019 - |
Вопрос
У меня есть программа, которая выходит из строя из-за ошибки сегментации.Создается основной файл.
запуск ядра в GDB дает мне следующее:
HP gdb 6.1 для HP Itanium (32- или 64-разрядная версия) и целевые HP-UX 11iv2 и 11iv3.
Ядро было создано gcpf1fwcApp.
Программа завершена сигналом 6: Прервано.
Я использовал команду
тред применить все BT
Когда я проверяю трассировку стека, я получаю ошибку в основном потоке, который находится в состоянии ожидания.
Однако, когда я запускаю ту же программу в GDB, я получаю совершенно другую ошибку в трассировке стека.Это кажется более правильным, чем дамп ядра.
Программа имеет 31 поток.
Почему я получаю такую разницу?
Решение
Возможно, вы просто ищете не ту ветку.
Пытаться thread apply all where
, и посмотрите, действительно ли один из потоков abort()
инж.
При отладке живого процесса GDB остановится, когда поток получит SIGABRT
, и поэтому, скорее всего, покажет вам соответствующую тему.
При отладке ядра (посмертная) GDB не знает, какой поток имеет значение, и поэтому показывает их вам в том порядке, в котором ОС сохранила их в ядре.Ядра Linux сохраняют поток, который первым вызвал завершение процесса, поэтому GDB в Linux показывает соответствующий поток из ядра.Я предполагаю, что HP-UX этого не делает, и вместо этого GDB показывает вам «случайный» поток.