【问题标题】: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
【解决方案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 的。