c - 帮助解释 gdb : segfault in function

标签 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() 中的某些内容正在失控。但我无法弄清楚问题到底是什么,因为该行引用了太多变量。

有人能帮我弄清楚 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];
};

此外,变量 valuename 不是段错误(但如果您认为是,我可以发布设置这些值的代码。)但是现在,如果我能理解这个 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/

相关文章:

c - 在C中将指针传递给结构数组

c - 为什么 getchar() 函数在这里不起作用?

gdb - GDB 中的 solib-absolute-prefix 与 solib-search-path

c - gdb 远程调试。实现一个伪造的 gdbserver stub 。经过多次请求和响应,得到警告 :invalid remote reply

c - 函数的二维字符数组的输出参数

c - 链接步骤找不到符号(XC8 编译器)

c - 使用结构进行动态内存分配

c - -0x4(%rbp) 在 gdb 反汇编中意味着什么?

c++ - 为什么 gcc 4.7.0 在这段代码上给我一个段错误,而在线 ideone(gcc 4.5.1) 却没有?

c - 为什么会出现核心转储?