使用 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,你会得到一个警告。所以我不明白这个问题(你可以在printfgdb 中放置一个断点) 您想知道调用printf之前的“垃圾值”是多少吗?或者您是否希望能够进入printf 函数? 我同意其他人的观点,即您的问题并不完全清楚。您究竟想通过使用 gdb 来获得哪些仅通过运行程序无法获得的信息? @BasileStarynkevitch 代码中没有直接的垃圾值,但printf 调用将愉快地读取“堆栈”的值,即使没有参数存在,并打印出来。 @JoachimPileborg 我知道这一点,但原海报可能不知道。实际上,我不明白这个问题(并且相信原始发布者也不明白) 【参考方案1】:

您可以在printf 上放置一个断点并使用$esp 检查堆栈

gdb 不知道垃圾值;但是在您的情况下,printf 恰好从堆栈中检索(使用va_args)一些“未定义”(实际上是“未初始化”,即包含一些以前的垃圾)值。

【讨论】:

我想进入 printf。我在读C,在一个面试题中发现了这个问题,我立即明白这会打印垃圾,但我想使用gdb进行调试以了解C程序的后台进程。

以上是关于使用 gdb 跟踪程序的主要内容,如果未能解决你的问题,请参考以下文章

从程序内部调用 gdb 以打印其堆栈跟踪的最佳方法?

从核心转储中获取堆栈跟踪

gdb 显示奇怪的堆栈跟踪

如何在 GDB 中使用跟踪

GDB堆栈跟踪与汇编调试

如何获取 gdb 调用堆栈跟踪?