帮助解释gdb:segfault的功能

时间:2009-09-07 03:37:31

标签: c gdb segmentation-fault

我正在尝试调试段错误,我从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()中的某些内容正在变得混乱。但我无法弄清楚究竟是什么问题,因为该行引用了很多变量。

有人可以帮助弄清楚0x8048af9 in parse_option_list...行告诉我的内容吗?

我的功能签名是:

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];
};

此外,变量valuename不是segfaulting(但如果您认为它们是,我可以发布设置这些值的代码。)但是现在,如果我能理解这个gdb输出,我会很高兴作为一个蛤蜊​​!谢谢!

3 个答案:

答案 0 :(得分:14)

你有经典缓冲区溢出的所有迹象。所有堆栈参数的值都被ASCII文本覆盖 - 这是这些值的转换(假设您有一个小端架构,看起来正确):

ptr = 0x6f72505f = "_Pro"
box_name = 0x696d6978 = "ximi"
option_list = 0x313a7974 = "ty:1"
num_elements = 0x33313532 = "2513"

将它们连接在一起会产生"_Proximity:12513" - 如果这个子字符串看起来很熟悉,你应该能够找到数据被复制的位置 - 在某处你将它复制到存储在堆栈中的数组中,适当的边界检查。

答案 1 :(得分:1)

0x8048af9是指令指针 - 内存中可执行代码的地址,代码在发生SEGFAULT时所处的位置。

你确定option_list [(* num_elements)]。value是一个有效的地址吗?你可能有一个缓冲区溢出,并覆盖你不应该的东西。

如果num_elements是option_list的长度,则option_list [(* num_elements)]指的是紧接在列表结尾之后。

答案 2 :(得分:0)

ptr = 0x6f72505f - 地址0x6f72505f超出范围 在这种情况下,这是有用的部分 parse_option_list的第一个输入无效。可能是一个未初始化的指针。