请查看这个简单的gdb会话。
我可以在中断后调用printf,但不能调用任何包含stdout的内容。我做错了什么?
(gdb) call printf("Hi :)n")
Hi :)
$1 = 6
(gdb) call fprintf(stdout, "Bug!n")
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7491d1d in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(fprintf) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb)
我的断点在这个非常小的程序的第三行:
int main() {
int x[20] = {};
x[0] = 3;
}
使用以下标志编译:
CFLAGS =-g -Wall -O0 -std=c11
LDLIBS=
我正在使用gdb:
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
This GDB was configured as "x86_64-linux-gnu"
提前感谢
这里的问题是没有为libc安装debuginfo,也没有为stdout
生成其他debuginfo。
但是,stdout
作为ELF符号仍然可见。gdb在90年代初做出的一个可能有意义的决定中,假设这样一个符号的类型是int
。但是,这与指针的大小不同。。。导致碰撞。
我认为您可以通过使用{}
扩展将其强制转换为正确的类型来解决此问题。或者,最简单的方法是安装glibc-debuginfo。许多发行版都有一种简单的方法来做到这一点。