У меня есть приложение C, которое мы развернули на сайте клиентов. Он был скомпилирован и работает на HP-UX. Пользователь сообщил об аварии, и мы получили дамп ядра. До сих пор я не мог дублировать крах в доме.Отладка основного файла без символов
Как вы подозреваете, основной файл/развернутый исполняемый файл полностью лишен каких-либо символов. Когда я загрузить его в БГД и сделать 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 ??()
Хотя было бы целесообразно собрать отладочную версию и развернуть его на месте у заказчика, а затем ждать, пока другой аварии, было бы довольно трудно и нежелательно по ряду причин.
Я хорошо знаком с кодом и имею относительно хорошее представление о том, где в коде он разбивается на основе отчета об ошибке клиента.
Есть ли какой-либо способ получить более подробную информацию из этого дампа ядра? Через строки или другой отладчик или что-нибудь еще? Благодарю.
Этот ответ кажется мне смехотворным. Я обязательно просмотрю код для потенциально переполненных областей. – Morinar
Если отладка с дубликатной копией ничего не показывает, пришло время начать смотреть на регистры и складывать стопки, чтобы попытаться сделать вывод, как вы вышли в середину нигде. Он также может быть выведенным (или неинициализированным) указателем на функцию, перераспределением распределения или, возможно, неправильным размером буфера или «плохим» вводом буфера (используя sprintf()/sscanf с неконтролируемым входом и т. Д.). – jesup
Я ничего здесь не делал, но я принимаю это, поскольку это все еще кажется наиболее вероятным. – Morinar