gpt4 book ai didi

c - 符号文件命令适用于较旧的 gdb 但不适用于较新的 gdb

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:14 24 4
gpt4 key购买 nike

我有一个问题,一个系统上的 gdb 我无法让 gdb 使用符号文件来在回溯中显示源文件和行号,但在一个旧系统上,它可以使用完全相同的命令美好的。可以运行的旧系统是 32 位 Debian 6,而不能运行的现代系统是 64 位 Debian 10。

在这两种情况下,我都在同一个系统上构建、运行和运行 gdb(因此系统之间没有交叉二进制文件或内核)

我可以用一个简单的玩具程序 (test.c) 重现这个,这个程序旨在立即崩溃:

int main()
{
int *i=0;
*i=0;
return 0;
}

我编译它并将其拆分为一个剥离的可执行文件和一个符号文件,然后运行可执行文件:

gcc -g test.c -o test
objcopy --only-keep-debug test test.dbg
objcopy --strip-debug test

ulimit -c unlimited
./test

然后我在 gdb 中打开核心转储。当我在旧系统(32 位,gdb 7.0.1-debian)上执行此操作时,我看到没有任何符号的回溯,但是一旦我运行 symbol-file test.dbg 我就会看到回溯中的源文件和行信息 (test.c:4)如果需要的话)

gdb -c core test
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0x080483a4 in main ()
(gdb) symbol-file test.dbg
Reading symbols from /home/user/test.dbg...done.
(gdb) bt
#0 0x080483a4 in main () at test.c:4
(gdb) quit

在较新的机器(64 位,gdb 8.2.1)上运行完全相同的序列,我得到以下结果

Core was generated by `./test'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000055e5dda71135 in main ()
(gdb) symbol-file test.dbg
Load new symbol table from "test.dbg"? (y or n) y
Reading symbols from test.dbg...done.
(gdb) bt
#0 0x000055e5dda71135 in ?? ()
#1 0x000055e5dda71150 in ?? ()
#2 0x00007eff7035f09b in __libc_start_main (main=0x55e5dda71125, argc=1, argv=0x7fff46187ec8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff46187eb8)
at ../csu/libc-start.c:308
#3 0x000055e5dda7106a in ?? ()
#4 0x00007fff46187eb8 in ?? ()
#5 0x000000000000001c in ?? ()
#6 0x0000000000000001 in ?? ()
#7 0x00007fff46188e8f in ?? ()
#8 0x0000000000000000 in ?? ()

加载符号文件不仅没有添加源和行,而且似乎在第一帧中丢失了 main()。我还尝试使用 add-symbol-file 而不是 symbol-file 并在命令行中使用 -s 包含符号文件选项,但没有更好的结果。我也试过将 -s 放在 -c 之前,正如我在网上发现的那样,但这也没有帮助。

编辑:以下请求的成绩单:

$ gcc -g test.c -o test
$ objcopy --only-keep-debug test test.dbg
$ ./test
Segmentation fault (core dumped)
$ gdb test.dbg core
GNU gdb (Debian 8.2.1-2+b1) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test.dbg...done.

warning: core file may not match specified executable file.
[New LWP 26602]
Core was generated by `./test'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000056477c36d135 in ?? ()
(gdb) bt
#0 0x000056477c36d135 in ?? ()
#1 0x000056477c36d150 in ?? ()
#2 0x00007fa3a18a509b in __libc_start_main (main=0x56477c36d125, argc=1, argv=0x7ffd0b6aed38, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffd0b6aed28)
at ../csu/libc-start.c:308
#3 0x000056477c36d06a in ?? ()
#4 0x00007ffd0b6aed28 in ?? ()
#5 0x000000000000001c in ?? ()
#6 0x0000000000000001 in ?? ()
#7 0x00007ffd0b6afe8d in ?? ()
#8 0x0000000000000000 in ?? ()
(gdb)

最佳答案

Running the exact same sequence on a newer machine (64-bit, gdb 8.2.1), I get the following

尝试使用 -fno-pie -no-pie 构建您的 test 二进制文件。

您的工作示例有一个非 PIE 地址(0x0804xxxx)。您的非工作示例有一个 PIE 地址(0x000055....)。 Debian 决定将 PIE 二进制文件作为默认文件,这为系统增加了一点安全性。

可能发生的情况是 GDB 在重新加载 symbol-file 时丢弃重定位信息。

附言您可以使用以下方法避免整个问题:

gdb test.dbg core

这将从一开始就正确启动 GDB。

附言命名任何二进制 test 通常是一个非常糟糕的主意,因为这可能会干扰条件的 shell 评估(如果 shell 找到 ./test 而不是 /bin/test,并且没有内置 test

关于c - 符号文件命令适用于较旧的 gdb 但不适用于较新的 gdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com