我想开始使用gdbserver进行远程调试,因此我在本地计算机上测试了它的功能,并使用一个简单的测试程序生成如下所示的段错误:
segfault.c - 编译成名为“test”的精灵
#define NULL ((void*)0)
int main()
{
int value = *((int*)NULL);
return value;
}
现在我跑的时候:
#gdb test
(gdb)run
我明白了:
Starting program: /home/awaibel/digiworkspace/test/Debug/test
Program received signal SIGSEGV, Segmentation fault.
0x080483bf in main () at ../segfault.c:4
4 int value = *((int*)NULL);
但是,如果我使用gdb服务器调试它,如下所示:
#gdbserver :65535 test
#gdb test
(gdb)target remote 127.0.0.1:65535
(gdb)continue
它为我提供了调试信息:
Program received signal SIGSEGV, Segmentation fault.
0x080483bf in ?? ()
似乎为segfault提供了相同的函数地址,但在使用远程调试器进行调试时,省略了名称和行号。是否可以让远程调试器显示此信息,如果是,如何显示?
我想我应该补充说,该程序是使用“-g”调试标志
使用GCC编译的答案 0 :(得分:2)
感谢markys的评论,我能够找出问题所在。由于gdb客户端是解析符号而不是服务器的,因此我必须确保客户端知道可执行文件副本的完整路径。由于'test'不在用于运行gdbtest的命令提示符的当前目录中,因此它没有要使用的符号的副本。将二进制文件添加到运行客户端的终端的PATH解决了问题。感谢。
汇总:
gdbserver --multi:port“path-to-executable”
gdb“path-to-executable” (GDB)GT;目标远程“ip-of-the-remote-device:port”