linux - 从 addr2line 获取完整路径

标签 linux binutils

我正在尝试自动执行一些调试任务。在某些情况下,我打印 $ra [这是一台 MIPS 机器] 的值和部分堆栈作为十六进制地址。在调试期间,我使用 addr2line 将它们转换为 file:line 对。

我想自动执行此过程。

问题是 addr2line 在编译时返回一个等同于 __FILE__ 值的文件名;即传递给编译器的文件名。这通常是 foo.c,有时是 src/foo.c。由于我的项目总共有几百个目录,这可能不足以唯一标识文件(可能有1/foo.c2/foo.c, ETC)。即使它是确定性的,开始在我的屏幕上为每个参数运行 find 似乎相当低效 [我想我可以构建一个哈希表并保存它们,但我想将其保留为一个简单的 bash 脚本]

GDB 似乎得到了正确的文件。如果我查看带有调试符号的实际源文件,我还可以看到在文件名之后似乎是 __FILE__ 的完整路径 [即,如果 __FILE__src/foo.c,它真的在/home/me/projects/something/comp1/src/foo.c,我会看到/home/me/projects/something/comp1 在文件中。我怎样才能以编程方式获得它?

谢谢。

最佳答案

这是非常令人惊讶的行为。我无法在以下位置复制它:

  • 带有 gcc 4.1.2 和 addr2line 2.17.50.0.6 的 Linux

  • 带有 gcc 4.3.4 和 gcc 3.4.4 以及 addr2line 2.20.51.20100410 的 Cygwin

addr2line 应该依赖于存储在可执行文件中的调试信息。并且调试信息应包含绝对路径(无论为编译器提供的源路径是什么)以避免在使用调试器时出现任何歧义。无论我在哪里尝试,addr2line 总是显示绝对路径。

假设您正在为您的构建系统使用 make,一个选项,尽管可能是一个痛苦的选项,是更改您的 makefile 以使用非递归策略(无论如何您确实应该这样做)。使用这样的系统,只有一个 make 实例在一个工作目录(通常是源代码树的顶层)中运行。因此,编译器的所有调用都指定了源文件的完整路径(相对于源树的根目录)。事实上,如果 addr2line 始终显示为编译器指定的文件名,这将解决您的问题。不是最好的解决方案,但可行。作为附带好处,您将获得非递归 make 的所有优势。

关于linux - 从 addr2line 获取完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3370067/

相关文章:

linux - Scheme 中的二次公式

linux - 在 FFMPEG 中选择出站 IP(eth0 或 eth1)

php - 使用php脚本编辑dhcp配置文件

c - clang 和 gcc 之间的行为差​​异?

c++ - 在链接时弱定义函数,并测试覆盖

linux - 如何在 Debian 上创建 HTTPS 代理服务器

osx-lion - Macports 安装 binutils

更改目标文件或库中的符号可见性 ('t' -> 'T' )

macos - 构建 ELLCC 时出错

macos - 如何使用atos? (或 Mac OS X 上的 addr2line)