我正在 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
的问题,但这似乎有其自身的问题。
好的,我通过更多的尝试和错误找到了这一点。
这些“文件支持的映射”路径似乎是相对于 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/"