我有一个C文件,我用-g
选项编译,并将调试符号保存到另一个文件中,并剥离了可执行文件。当我尝试用set debug-file-directory /root/test
调试此可执行文件时,我无法设置断点。我猜符号文件Map不起作用。有人能在这里给予一些输入吗?
#include <stdio.h>
void func1()
{
}
int main() {
FILE *fp;
fp = fopen ("/tmp/abcdefg", "w");
func1();
}
用调试符号编译;
gcc -g file.c
已将两柴符号储存至相同目录中的不同档案。
strip --strip-debug a.out -o a.out.debug
剥离了可执行文件;
strip a.out
exe a.out
和调试符号文件a.out.debug
位于/root/test
目录中。
正在启动gdb
会话;
root@ubuntu:~/test# gdb a.out
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.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 a.out...(no debugging symbols found)...done.
(gdb) set debug-file-directory /root/test
(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/root/test".
(gdb) b main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) q
You have new mail in /var/mail/root
2条答案
按热度按时间lhcgjxsq1#
正如the busybee所说,您的一些命令不正确。
您应该查看gdb documentation on separate debug files以获得更完整的描述,但是,您需要的命令是:
strip --only-keep-debug
仅将调试部分从a.out
复制到a.out.debug
。然后,
strip --strip-debug
只从a.out
中删除调试部分,而不删除其他部分。objcopy --add-gnu-debuglink=a.out.debug
在a.out
中添加了一个小部分,告诉GDB包含调试信息的文件名。GDB使用一些内置的规则,以及debug-file-directory
来查找调试链接中指定的文件。最后,当我们启动GDB时,我们可以看到它已经找到了外部调试信息。
bweufnob2#
您至少有两个错误:
strip --strip-debug a.out -o a.out.debug
不会按照您的想法执行。它不是“导出”调试信息,而是将其删除并将结果保存在“a.out.debug”中。结果是一个带有调试信息的可执行文件。
下一步查找选项
--only-keep-debug
。未将任何调试信息加载到gdb中
启动GDB后,使用
symbol-file
命令加载调试符号,我认为GDB不能自动找到调试信息,因为它不知道文件名。您不需要为此更改debug-file-directory。