Отладка с помощью gdb — (gdb) & xot; указатель x / s & quot; выход

Я пытаюсь отладить с помощью 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:  ""

Может кто-нибудь сказать мне, как я могу решить эту проблему? Заранее спасибо!

1

Решение

… хорошо несколько раз. Но часто я получаю либо значение Null, т. Е. «», Либо какое-то случайное числовое значение …

Был там, сделал это. Позвольте мне побудить вас к творчеству.

Иногда я создаю функцию (называемую foo? Bar? Show? Dump?), Которая не используется отлаживаемой программой. Эта функция часто имеет c-стиль (потому что GDB, кажется, понимает это лучше и проще вызывать), глобальная область видимости, простая. Временная установка этой функции близка (в том же файле?) К тому, что вы хотите, чтобы улучшить видимость иногда помогает.

Затем я могу вызвать эту функцию с помощью команды gdb p, например:

 gdb> p foo

Можно передать параметры в foo, но если я касаюсь кода для отладки чего-либо, я обычно делаю foo более способным … когда нет параметров, это делает одно. Или, возможно, используйте параметр int (bar (7)), который переключается, чтобы показать больше или иначе.

Эксперимент.

Это не типично, и я подозреваю, что лучшее знание gdb может стоить усилий, если я смогу вспомнить его в следующий раз, когда оно мне понадобится. Иногда GDB просто не понимает, и я не могу понять, почему. В других случаях мне удается добавить указатель и попытаться напечатать это:

gdb> p *foobar
0

Другие решения

Но часто я получаю либо значение Null, т. Е. «», Либо некоторые случайные числовые значения.

Нет ничего плохого в том, что вы показываете. Просто область памяти, которую вы изучаете, не указывает на строку (0x59c00eb0) или указывает на пустую строку (0x5ab022a8).

Вы не представили никаких доказательств того, что эти местоположения должны указывать на строку, и фактически, как показывал (теперь удаленный) комментарий context указывает на struct _krb5_context, который содержит магическое число в качестве первого члена. Поэтому вы должны использовать x/w изучить это.

2

По вопросам рекламы [email protected]