【问题标题】:Trace Program using gdb使用 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 我知道这一点,但原海报可能不知道。实际上,我不明白这个问题(并且相信原始发布者也不明白)

标签: c linux gdb


【解决方案1】:

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

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

【讨论】:

  • 我想进入 printf。我在读C,在一个面试题中发现了这个问题,我立即明白这会打印垃圾,但我想使用gdb进行调试以了解C程序的后台进程。
猜你喜欢
  • 2013-05-26
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2017-02-11
  • 2012-07-16
  • 2011-06-15
  • 2012-02-29
相关资源
最近更新 更多