我有一个由剥离应用程序生成的堆栈跟踪,如下所示:

 *** Check failure stack trace: ***
    @     0x7f0e442d392d  (unknown)
    @     0x7f0e442d7b1f  (unknown)
    @     0x7f0e442d7067  (unknown)
    @     0x7f0e442d801d  (unknown)
    @     0x7f0e457c55e6  (unknown)
    @     0x7f0e457c5696  (unknown)
    @           0x4e8765  (unknown)
    @           0x4a8b43  (unknown)
    @     0x7f0e43197ced  (unknown)
    @           0x4a6889  (unknown)

我有一个非剥离版本的可执行文件及其所有库(使用调试信息编译).但是我怎样才能把地址翻译成文件和行号呢??

以下是我try 过的:

gdb
set solib-absolute-prefix /path/to/non-stripped/edition/of/root/filesystem/sysroot/
file /path/to/non-stripped/edition/of/root/filesystem/sysroot/usr/bin/my-buggy-app
info line *0x7f0e457c5696

当我输入file命令时,它只加载文件中的符号,而不是所有使用的库.有没有办法做到这一点?

"信息行"命令显示:

地址0x7f0e442d801d没有可用的行号信息

我认为这是因为地址在其中一个共享库中,但我怎么知道地址在哪一个库中呢?

推荐答案

但是我怎样才能把地址翻译成文件和行号呢?

对于主可执行文件(地址如0x4e8765),请执行以下操作:

addr2line -e /path/to/non-stripped/.../my-buggy-app \
    0x4a6889 0x4a8b43 0x4e8765

实际上,您可能想从上述所有地址中减go 5(CALL指令的通常长度).

对于共享库中的地址,您必须知道库的加载地址.

如果应用程序生成了core个文件,那么(gdb) info shared将告诉您库的加载位置.

如果您没有获得核心文件,并且应用程序没有打印所需的映射,那么

  • 您应该修复应用程序,使其打印该信息(没有它,堆栈跟踪基本上是无用的),并且
  • 你仍然可以猜测:看看可执行文件中0x4e8760的代码——它应该是某个函数的CALL指令.现在找出该函数所在的库,并在库中找到它的地址(通过nm).如果你幸运的话,那个地址在0xNc56NN附近.现在你可以猜出0x7f0e457NNNNNN的任何库的加载地址.重复0x7f0e457c55e1,你可以在0x7f0e442dNNNN找到图书馆的加载地址.

Linux相关问答推荐

我使用Windows 10,但我无法在我的WSL2上下载vscode

一个bash脚本,用于基于2列映射文件替换多个文件名中的模式

如何在不使用LD_LIBRARY_PATH或RPATH的情况下运行链接到共享库的二进制文件?

为什么我的Linuxshell 程序有时找不到它刚刚创建的文件?

将十六进制文件名转换为十进制

我需要从 Ubuntu 中删除 .txt 文件中以白色间距分隔的行的白色间距

如何在我的 PC 上配置 GitLab 和 GitHub ssh 密钥

通过 ssh 在远程计算机上按索引访问数组元素

RabbitMQ 安装后没有自动启动

ENQCMD 指令的好处和微操作是什么?

根据其他列的值创建一个新列

为什么 8 位字符串文字可以包含多字节字符,而 char 向量不能?

普通用户 chown(仅更改组)

如何忽略 diff 命令中的一些差异?

使用 AWS CLI 进行 Bash - 无法找到凭证

我需要 -D_REENTRANT 和 -pthreads 吗?

CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_RAW 有什么区别?

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

查找和基本名称不能很好地播放

未找到版本CXXABI_1.3.8(...要求)