请看这个简单的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)
我的断点位于这个非常小的程序的第3行:
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"
提前致谢
答案 0 :(得分:2)
这里的问题是你没有为libc安装debuginfo,也没有生成stdout
的其他debuginfo。
但是,stdout
仍可作为ELF符号显示。 gdb在90年代早期可能有意义的决定中假设这种符号的类型是int
。但是,它的大小与指针不同......导致崩溃。
我认为您可以使用{}
扩展程序将其强制转换为正确的类型来解决此问题。或者,最简单的是,安装glibc debuginfo。许多发行版都有一种简单的方法可以做到这一点。