У меня есть приложение C, которое мы развернули на сайте клиентов. Он был скомпилирован и работает на HP-UX. Пользователь сообщил о сбое, и мы получили дамп ядра. До сих пор я не смог повторить аварию в доме.
Как вы могли бы подозревать, основной файл / развернутый исполняемый файл полностью лишен каких-либо символов. Когда я загружаю его в gdb и делаю bt, лучшее, что я получаю, это:
(gdb) bt
#0 0xc0199470 in ?? ()
Я могу создать «ядро строк» для файла, но, насколько я понимаю, все, что я получаю, - это все строки в исполняемом файле, поэтому кажется, что там почти невозможно отследить что-либо.
У меня есть отладочная версия (скомпилированная с -g) исполняемого файла, которая, к сожалению, на пару месяцев новее выпущенной версии. Если я пытаюсь запустить GDB с этим концентратором, я вижу это:
warning: exec file is newer than core file.
Core was generated by `program_name'.
Program terminated with signal 11, Segmentation fault.
__dld_list is not valid according to __dld_flags.
#0 0xc0199470 in ?? ()
(gdb) bt
#0 0xc0199470 in ?? ()
Хотя было бы целесообразно скомпилировать отладочную версию и развернуть ее на сайте клиента, а затем дождаться следующего сбоя, это будет относительно сложно и нежелательно по ряду причин.
Я достаточно хорошо знаком с кодом и относительно неплохо представляю, где в коде происходит сбой, основываясь на отчете об ошибке клиента.
Есть ли ЛЮБОЙ способ узнать больше информации из этого дампа памяти? Через строки или другой отладчик или что-нибудь? Спасибо.