我正在尝试调试段错误,并且我从 gdb 获得了以下输出:
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x08048af9 in parse_option_list (ptr=0x6f72505f <Address 0x6f72505f out of bounds>, box_name=0x696d6978 <Address 0x696d6978 out of bounds>, option_list=0x313a7974,
num_elements=0x33313532) at submit.c:125
125 memcpy(&(option_list[(*num_elements)].value), value, 24);
(gdb) p num_elements
$15 = (int *) 0x33313532
(gdb) p *num_elements
Cannot access memory at address 0x33313532
(gdb)
在我看来,memcpy() 中的某些内容正在失控。但我无法弄清楚问题到底是什么,因为该行引用了太多变量。
有人能帮我弄清楚 parse_option_list 中的 0x8048af9...
行告诉我什么吗?
我的函数签名是:
int parse_option_list(char *ptr, char *box_name,
struct option_list_values *option_list, int *num_elements)
这可能会有用:
struct option_list_values {
char value[24];
char name[24];
};
此外,变量 value
和 name
不是段错误(但如果您认为是,我可以发布设置这些值的代码。)但是现在,如果我能理解这个 gdb 输出,我会很高兴!谢谢!
最佳答案
您具有典型缓冲区溢出的所有迹象。所有堆栈参数的值都已被 ASCII 文本覆盖 - 这是这些值的翻译(假设您有一个看起来正确的小端架构):
ptr = 0x6f72505f = "_Pro"
box_name = 0x696d6978 = "ximi"
option_list = 0x313a7974 = "ty:1"
num_elements = 0x33313532 = "2513"
将它们连接在一起得到 "_Proximity:12513"
- 如果这个子字符串对你来说很熟悉,你应该能够追踪到数据被复制的位置 - 你正在将它复制到一个数组存储在堆栈中,没有适当的边界检查。
关于c - 帮助解释 gdb : segfault in function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1387450/