Я пытаюсь отладить с помощью GDB. Я понял, что если вы хотите выводить в строку, вы должны использовать «x / s Ptr». Это отлично работает некоторое время. Но часто я получаю либо значение Null, т. Е. «», Либо некоторые случайные числовые значения. В моем файле 10000 строк кодов. :-p Пожалуйста, найдите некоторые выходные данные GDB. Например,
krb5_get_credentials_for_user (context=0x59c00eb0, options=4, ccache=0x5a001d40, in_creds=0x5ab022a8, subject_cert=0x0,
out_creds=0x5ab02378) at test_abc.c:696
(gdb) x/s 0x59c00eb0
0x59c00eb0: "$\247\016\227"(gdb) x/s 0x5ab022a8
0x5ab022a8: ""
Может кто-нибудь сказать мне, как я могу решить эту проблему? Заранее спасибо!
… хорошо несколько раз. Но часто я получаю либо значение Null, т. Е. «», Либо какое-то случайное числовое значение …
Был там, сделал это. Позвольте мне побудить вас к творчеству.
Иногда я создаю функцию (называемую foo? Bar? Show? Dump?), Которая не используется отлаживаемой программой. Эта функция часто имеет c-стиль (потому что GDB, кажется, понимает это лучше и проще вызывать), глобальная область видимости, простая. Временная установка этой функции близка (в том же файле?) К тому, что вы хотите, чтобы улучшить видимость иногда помогает.
Затем я могу вызвать эту функцию с помощью команды gdb p, например:
gdb> p foo
Можно передать параметры в foo, но если я касаюсь кода для отладки чего-либо, я обычно делаю foo более способным … когда нет параметров, это делает одно. Или, возможно, используйте параметр int (bar (7)), который переключается, чтобы показать больше или иначе.
Эксперимент.
Это не типично, и я подозреваю, что лучшее знание gdb может стоить усилий, если я смогу вспомнить его в следующий раз, когда оно мне понадобится. Иногда GDB просто не понимает, и я не могу понять, почему. В других случаях мне удается добавить указатель и попытаться напечатать это:
gdb> p *foobar
Но часто я получаю либо значение Null, т. Е. «», Либо некоторые случайные числовые значения.
Нет ничего плохого в том, что вы показываете. Просто область памяти, которую вы изучаете, не указывает на строку (0x59c00eb0
) или указывает на пустую строку (0x5ab022a8
).
Вы не представили никаких доказательств того, что эти местоположения должны указывать на строку, и фактически, как показывал (теперь удаленный) комментарий context
указывает на struct _krb5_context
, который содержит магическое число в качестве первого члена. Поэтому вы должны использовать x/w
изучить это.