【问题标题】:Stop GDB from stepping through glibc functions阻止 GDB 单步执行 glibc 函数
【发布时间】:2017-01-02 19:31:01
【问题描述】:

抱歉标题不伦不类,想不出更好的了。

当我通过 GDB 运行我的程序以查找分段错误时,我得到 数千 行这样的垃圾:

(gdb) step
_IO_new_file_xsputn (f=0x76fa0b40 <_IO_2_1_stdout_>, data=0x7efff284, n=7) at fileops.c
1279    fileops.c: No such file or directory.
(gdb) step
1273    in fileops.c
(gdb) step
1279    in fileops.c
(gdb) step
1286    in fileops.c
(gdb) step
1288    in fileops.c
(gdb) step
1289    in fileops.c
(gdb) step
1292    in fileops.c
(gdb) step
1294    in fileops.c
(gdb) step
1292    in fileops.c

...不断地不断地。它使调试非常变得困难和乏味,因为:

  • 我必须重复输入step(或按Enter)。
  • 我几乎看不到程序的输出,因为它隐藏在无意义的信息中。
  • 如果我反复按 Enter,我经常会错过我正在寻找的 Seg Fault。

如何让 gdb 停止打印这样的行?

1273     in fileops.c

我可以使用一些配置文件或命令行选项吗?

【问题讨论】:

  • 您确定需要单步执行fileops.c 中的glibc 代码吗?您可以只finish 退出_IO_new_file_xsputn 函数并继续调试您的代码。
  • @ks1322 我想这就是我要找的;我很快就会试试看。你可以把它放在答案中吗?
  • 相关:Preventing GDB from stepping into a function (or file)。请参阅skip 命令。

标签: c debugging gdb output


【解决方案1】:

您确定需要单步执行fileops.c 中的 glibc 代码吗?

如果你只想调试你自己的代码,你应该在进入finish当前帧之后退出_IO_new_file_xsputn函数并继续调试你的代码。

【讨论】:

    【解决方案2】:

    如何让 gdb 停止打印这样的行?

    通过使用step 命令,您要求 GDB 准确地打印此信息。

    如果您不想要该信息,您应该停止询问

    我经常错过我正在寻找的 Seg Fault。

    如果你只是run,GDB会在你得到SIGSEGV时自动停止,你不能错过。

    可能想要的是在SIGSEGV 之前的某个时间停止您的代码,然后从那里开始。有几种技术可以实现这一点,reverse debugging 就是其中之一。使用replay debugging 是另一回事。

    很难提供更多建议,因为你没有展示你实际上想要做什么。

    【讨论】:

      【解决方案3】:

      这就是step 的工作原理 - 它逐步通过代码。

      断点呢?如果您设置一个,调试器将停在那里并让您手动单步执行代码。

      对于中止执行的分段错误或类似信号,您可以在程序停止时runbacktrace 获取有关执行停止位置的信息。然后在此处设置断点,程序将在违规指令处停止。

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多