如何在 GDB 中设置核心转储的文件支持映射的路径?

问题描述 投票:0回答:1

我正在 x86 Ubuntu 机器上针对嵌入式 ARM 目标进行交叉编译。

如果应用程序出现段错误,我会得到核心转储。

当我跑步时:

gdb-multiarch my_app core

我得到:

Reading symbols from my_app ...
warning: Can't open file /home/my_user/bin/my_app during file-backed mapping note processing
warning: Can't open file /usr/lib/aarch64-linux-gnu/libc.so.6 during file-backed mapping note processing
warning: Can't open file /usr/lib/aarch64-linux-gnu/libgcc_s.so.1 during file-backed mapping note processing
...
(gdb) bt
#0  0x0000aaaacab2cd50 in ?? ()
warning: (Internal error: pc 0x37 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x37 in read in psymtab, but not in symtab.)
#1  0x0000000000000038 in ?? (warning: (Internal error: pc 0x37 in read in psymtab, but not in symtab.)
)
warning: (Internal error: pc 0x37 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x37 in read in psymtab, but not in symtab.)
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

但是,如果我将arm二进制文件移动到主机上的

/home/my_user/bin/my_app
(这是二进制文件在目标上运行的路径),回溯将按预期工作,我可以很好地调试。虽然这可行,但在主机上复制任意路径有点痛苦。

gdb 支持源、sysroot 和动态 lib 路径映射: https://sourceware.org/gdb/current/onlinedocs/gdb.html/Source-Path.html

set sysroot $PATH
set solib-search-path $PATH

但尚不清楚其中是否有任何内容与文件支持的映射相关。

我也不完全清楚为什么核心转储引用文件支持的映射,而不是使用从我指定为 gdb 参数的二进制文件加载的符号。

知道如何避免制作任意路径吗?似乎有一种方法可以解决

chroot
的问题,但这似乎有其自身的问题。

debugging gdb cross-compiling coredump
1个回答
0
投票

好的,我通过更多的尝试和错误找到了这一点。

这些“文件支持的映射”路径似乎是相对于 sysroot 的。这意味着我可以在临时目录中复制路径,设置 sysroot,并正确加载内容。

例如,如果我的工作目录是/tmp。跑步

mkdir -p ./home/my_user/bin/
mv my_app ./home/my_user/bin/
gdb-multiarch ./home/my_user/bin/my_app core

有效。

它还可以通过以下方式设置 sysroot:

gdb-multiarch /tmp/home/my_user/bin/my_app core --init-eval-command="set sysroot /tmp/"

© www.soinside.com 2019 - 2024. All rights reserved.