运行某些代码后,gdb调试会话中的malloc返回不可访问的地址。
首先在main函数的开头打破。 一切都好。
Breakpoint 9, main (argc=5, argv=0x7fffffffe418) at src/ose/sdv/ose_sdv/linux/main.c:557
557 char *cfgfile = NULL;
(gdb) call malloc(4)
$50 = 23293968
(gdb) x 23293968
0x1637010: 0x00000000
(gdb) c
运行一些行后,它开始返回无法访问的内存地址,该地址从0xffffffff开始〜
Program received signal SIGINT, Interrupt.0x00007ffff70c1f4d in read () from /lib64/libc.so.6
(gdb) call malloc(4)
$52 = -1811110576
(gdb) x -1811110576
0xffffffff940ca550: Cannot access memory at address 0xffffffff940ca550
我正在使用64位Linux操作系统。
我无法找到导致此问题的确切代码行。
malloc开始喜欢这样的行总是改变。
运行时没有异常,程序按预期运行。 我不确定这里有什么问题。
答案 0 :(得分:1)
你的程序中有 错误。 C ++中的错误并不总是提供异常,而C没有exceptions的概念。阅读undefined behavior。
在call malloc(4)
下输入gdb
时,您要求gdb
在您的错误流程中调用malloc
。
malloc
(或new
)可能会为一次运行提供不同地址的原因是ASLR。如果您想通过
echo 0 > /proc/sys/kernel/randomize_va_space
您应该使用gcc -Wall -g
进行编译并使用gdb
作为调试器(可能watch
的{{1}}命令可能很有用)。
可能发生的是你错误地覆盖了堆gdb
- 内存区域之外的某个单词,或者得到了buffer overflow,或者使用了未初始化的变量等等......
混淆malloc
非常糟糕的一个好方法是在某个malloc
区域之前写一下malloc
,然后是int *p = malloc(4); p[-1]=1234;
和free
可能表现出非常奇怪的行为......
你应该用valgrind来追捕你的记忆错误。尝试运行
malloc
你的程序参数 ....
使用最近的GCC(即4.8),您还可以尝试使用-fsanitize=address选项进行编译和链接(除了valgrind yourprogram
)