C 远程进程的源代码名称和行号

C 远程进程的源代码名称和行号,c,gdb,ptrace,dwarf,libunwind,C,Gdb,Ptrace,Dwarf,Libunwind,您好,我正在尝试创建某种调试器,它会查看系统调用以检测它们,但是从可用性的角度来看,我希望能够获得检测到错误的源代码名和行号。 我一直在使用名为libunwind的库,但它给了我函数名、函数偏移量和可执行文件地址空间中的程序计数器。但是,如果您查看valgrind或gdb,它会在使用-g标志编译时提供行号和源代码名。如何操作?对于交互式查看,可以使用addr2line命令行实用程序。它接受可执行文件名和程序计数器的地址,并输出源文件和行。如果您创建了一个编程解析器,您可以使用它来检查自己 要将地

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

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

要将地址解析为程序中的一行,必须解析可执行文件中的矮人信息,特别是行号部分。粗略地看一下libunwindapi,它似乎不支持检索此类信息。有一种支持通用矮人解析的方法。这将是一个相当复杂的项目,虽然行号在DWARF中的存储方式并不简单

如果不想一直使用libdwarf,可以使用readelf-debug dump=decodedline命令行将行号部分转换为一个相对容易解析的文本文件,并从C程序中解析/解释它。它将为您提供程序计数器值范围和源行号之间的对应关系

从命令行转储行信息的另一种方法是dwarfdump-l。这是一个较低级别的IIRC

请记住内联函数。同一PC值可能对应于多个源线


要以交互方式查看可执行文件中的DWARF信息,可以使用完整的披露:我编写了GUI。行号将位于源文件的顶部项下,即stmt_列表下。该工具背后的DWARF解析器不是C解析器。

要进行交互式查看,可以使用addr2line命令行实用程序。它接受可执行文件名和程序计数器的地址,并输出源文件和行。如果您创建了一个编程解析器,您可以使用它来检查自己

要将地址解析为程序中的一行,必须解析可执行文件中的矮人信息,特别是行号部分。粗略地看一下libunwindapi,它似乎不支持检索此类信息。有一种支持通用矮人解析的方法。这将是一个相当复杂的项目,虽然行号在DWARF中的存储方式并不简单

如果不想一直使用libdwarf,可以使用readelf-debug dump=decodedline命令行将行号部分转换为一个相对容易解析的文本文件,并从C程序中解析/解释它。它将为您提供程序计数器值范围和源行号之间的对应关系

从命令行转储行信息的另一种方法是dwarfdump-l。这是一个较低级别的IIRC

请记住内联函数。同一PC值可能对应于多个源线


要以交互方式查看可执行文件中的DWARF信息,可以使用完整的披露:我编写了GUI。行号将位于源文件的顶部项下,即stmt_列表下。该工具背后的DWARF解析器不是C解析器。

不幸的是,libunwind只擅长从调用堆栈获取地址。你要找的图书馆是

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


编辑:另一个选项是。我没有这方面的经验,虽然我可以证明libbacktrace的岩石

不幸的是,libunwind只擅长从调用堆栈获取地址。你要找的图书馆是

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


编辑:另一个选项是。我没有这方面的经验,虽然我可以证明libbacktrace的岩石

谢谢你的详尽回答这真的很有帮助我会研究选项。我们在这里通过向上投票和/或接受答案表示感谢:谢谢你的详尽回答这真的有助于我研究选项。我们在这里通过向上投票和/或接受答案表示感谢: