【问题标题】:source code name and line number of the remote process远程进程的源代码名称和行号
【发布时间】:2020-06-13 22:20:08
【问题描述】:

您好,我正在尝试创建某种调试器来查看系统调用以检测它们,但从可用性的角度来看,我希望能够获得检测到错误的源代码名称和行号。 我一直在使用名为 libunwind 的库,但它给了我函数名、函数偏移量以及可执行文件地址空间中的程序计数器。但是,如果您查看 valgrind 或 gdb,它会在使用 -g 标志编译时为您提供行号和源代码名称。我该怎么做?

【问题讨论】:

    标签: c gdb ptrace dwarf libunwind


    【解决方案1】:

    不幸的是,libunwind 只擅长从调用堆栈中获取地址。您要查找的库是libbacktrace by Ian Lance Taylor

    它解析 DWARF 调试信息。因此,它能够生成包含内联函数名称、源文件名和行号的回溯。

    编辑:另一个选项是backward-cpp。不过,我没有这方面的经验,但我可以证明 libbacktrace 非常棒!

    【讨论】:

      【解决方案2】:

      对于交互式查看,您可以使用addr2line 命令行实用程序。它采用可执行名称和地址(程序计数器),并输出源文件和行。如果您创建了一个程序解析器,您可以使用它来检查自己。

      要将地址解析为来自程序的行,您必须解析可执行文件中的 DWARF 信息,特别是行号部分。粗略地看一下libunwind API,它似乎不支持检索那种信息。 another library called libdwarf 支持通用 DWARF 解析。不过,这将是一个相当复杂的项目,行号存储在 DWARF 中的方式并不简单。

      如果你不想一直使用libdwarf,可以使用readelf --debug-dump=decodedline命令行将行号部分翻译成(相对)易于解析的文本文件,并解析/解释那个来自你的 C 程序。它将为您提供程序计数器值(范围)和源代码行号之间的对应关系。

      从命令行转储行信息的另一种方法是dwarfdump -l。那个是更底层的 IIRC。

      记住内联函数。相同的 PC 值可能对应多个源代码行。

      要以交互方式查看可执行文件中的 DWARF 信息,您可以使用DWARF Explorer GUI tool(完全披露:我编写了 GUI)。行号将在源文件的顶部项目下,在stmt_list 下。该工具背后的 DWARF 解析器 is a Python one,不是 C 的。

      【讨论】:

      • 感谢您的详尽回答,这真的很有帮助,我将研究选项。
      • 我们通过投票和/或接受答案表示感谢:)
      猜你喜欢
      • 1970-01-01
      • 2013-02-15
      • 2018-12-08
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多