使用 gdb 跟踪程序
Posted
技术标签:
【中文标题】使用 gdb 跟踪程序【英文标题】:Trace Program using gdb 【发布时间】:2013-02-19 06:47:16 【问题描述】:int main(int ac, char *av[])
printf("%d");
return 0;
我知道这会打印垃圾,但是如何使用gdb跟踪程序来检查垃圾值?
【问题讨论】:
您的代码中没有垃圾值。如果您使用未初始化的int x;
调用printf("%d\n", x);
,就会出现这种情况。如果你在编译时将-Wall
传递给gcc
,你会得到一个警告。所以我不明白这个问题(你可以在printf
和gdb
中放置一个断点)
您想知道在调用printf
之前的“垃圾值”是多少吗?或者您是否希望能够进入printf
函数?
我同意其他人的观点,即您的问题并不完全清楚。您究竟想通过使用 gdb
来获得哪些仅通过运行程序无法获得的信息?
@BasileStarynkevitch 代码中没有直接的垃圾值,但printf
调用将愉快地读取“堆栈”的值,即使没有参数存在,并打印出来。
@JoachimPileborg 我知道这一点,但原海报可能不知道。实际上,我不明白这个问题(并且相信原始发布者也不明白)
【参考方案1】:
您可以在printf
上放置一个断点并使用$esp
检查堆栈
gdb
不知道垃圾值;但是在您的情况下,printf
恰好从堆栈中检索(使用va_args
)一些“未定义”(实际上是“未初始化”,即包含一些以前的垃圾)值。
【讨论】:
我想进入 printf。我在读C,在一个面试题中发现了这个问题,我立即明白这会打印垃圾,但我想使用gdb进行调试以了解C程序的后台进程。以上是关于使用 gdb 跟踪程序的主要内容,如果未能解决你的问题,请参考以下文章