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



我正在尝试使用 gdb 进行调试。我知道如果你想在字符串中输出,你必须使用"x/s Ptr"。它工作正常一段时间。但是很多时候我得到的是空值,即" "或一些随机数值。我的文件有 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:  "$24716227"
(gdb) x/s 0x5ab022a8
0x5ab022a8:  ""

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

但是很多时候我得到的是空值,即" "或一些随机数值。

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

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

。有些时候很好。但是很多时候我得到的是空值,即" " 或一些随机数字...

去过那里,做到了。 请允许我鼓励你们发挥创造力。

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

以提高可见性。

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

 gdb> p foo

可以将参数传递给 foo,但是如果我触摸代码来调试某些内容,我通常会使 foo 更强大......当没有参数时,它会做一件事。 或者可以使用一个 int 参数 (bar(7)) 来切换以显示更多或不同的内容。

实验。

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

gdb> p *foobar   

最新更新