gpt4 book ai didi

c - gdb 和 stdout 有什么问题?

转载 作者:行者123 更新时间:2023-12-01 23:45:11 25 4
gpt4 key购买 nike

请看这个简单的 gdb session 。

我可以在休息后调用 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"

提前致谢

最佳答案

这里的问题是您没有为 libc 安装调试信息,也没有为 stdout 生成其他调试信息。

但是,stdout 仍然作为 ELF 符号可见。 gdb 在一个可能在 90 年代初有意义的决定中假设这样一个符号的类型是 int。但是,这与指针的大小不同……导致崩溃。

我认为您可以通过使用 {} 扩展将其转换为正确的类型来解决这个问题。或者,最简单的方法是安装 glibc debuginfo。许多发行版都有一个简单的方法来做到这一点。

关于c - gdb 和 stdout 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29687956/

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