使用 gdb 调试 - (gdb) "x/s pointer" 输出

Debugging with gdb - (gdb) "x/s pointer" output

我正在尝试使用 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:  "$767"
(gdb) x/s 0x5ab022a8
0x5ab022a8:  ""

有人可以告诉我如何解决这个问题吗?提前致谢!

But many times I am getting either Null value i.e. " " or some random numeric values.

你展示的没有问题。只是您正在检查的内存位置未指向字符串 (0x59c00eb0) 或指向空字符串 (0x5ab022a8).

你没有提供任何证据表明这些位置应该指向一个字符串,事实上,正如(现已删除)评论显示 context 指向 struct _krb5_context,其中包含幻数作为第一个成员。因此,您应该使用x/w来检查它。

... fine some times. But many times I am getting either Null value i.e. " " or some random numeric...

去过那里,做过那件事。请允许我鼓励您发挥创造力。

我有时会创建一个函数(称之为 foo?bar?show?dump?),但它不会被正在调试的程序使用。该函数通常是 c 风格的(因为 gdb 似乎理解得更好,调用起来更简单),全局范围,简单。临时安装此功能关闭(在同一个文件中?)您想要提高可见性有时会有所帮助。

然后我可以使用 gdb p 命令调用这个函数,例如

 gdb> p foo

可以将参数传递给 foo,但如果我接触代码来调试某些东西,我通常会让 foo 更有能力……当没有参数时它只做一件事。或者也许使用一个 int 参数 (bar(7)) 切换显示更多或不同。

实验。

这不是典型的,我怀疑更好地了解 gdb 可能是值得的,如果我能记住它以备下次需要时使用。有时候 gdb 就是不明白,我也想不通为什么。其他时候,我会添加一个指针并尝试打印它:

gdb> p *foobar