【发布时间】:2011-06-01 13:12:01
【问题描述】:
由于对错误指针的 free() 调用,我的程序在单一测试中严重崩溃,并显示以下错误消息:
*** glibc detected *** /home/user/main.out: free(): invalid pointer: 0x006d0065 ***
代码大致如下:
// constructor is MyObj( const std::string & )
// and copies the string in its own std:string member
MyObject *obj = new MyObject("some string arg");
if(obj->isValid)
{
log("Success\n");
}
delete obj; // if I remove this, the program doesn't crash...
我的调查是这样的:
我试图跟踪我创建并释放的指针,但它发生在不同的地址空间中,我得到(成功)这样的删除:
Delete buffer @0x850ed0。所以我怀疑有什么东西试图释放一个静态字符指针。此外,地址在多次尝试后保持不变,这让我在这个谓词中感到欣慰。-
我无法使用 GDB,因为我正在使用的平台似乎已经退出:
Program received signal SIGABRT, Aborted.[Switching to Thread 0x344314e8 (LWP 1443)]0x2a3dd658 in raise () from /lib/libc.so.6(gdb) bt#0 0x2a3dd658 in raise () from /lib/libc.so.6#1 0x2a3dea2c in abort () from /lib/libc.so.6Backtrace stopped: frame did not save the PC -
我尝试使用 hexdump 转储程序中 free() 失败的地址:
hexdump -C ~/main.out -s 0x6d0000 -n 2000它给了我这个(故障是
free(0x6d0065)):006d0060 e8 32 06 00 2c e6 02 5f 5a 4e 4b 53 73 34 66 69 |.2..,.._ZNKSs4fi|006d0070 6e 64 45 63 6a 00 ab 00 00 00 01 3e 58 00 00 1d |ndEcj......>X...|这看起来像一个std::string函数,这很奇怪...... 我认为这可能是对 hexdump 的不好使用,因为当程序加载到内存中时内存会被重新定位。
我也试过
readelf ~/main.out -a | grep 6d0065也无济于事(没有成功)
我不是在这些条件下调试的专家;你知道我怎样才能得到这个地址对程序的意义吗?
编辑:
程序在嵌入式平台(SH4)上运行; valgrind 不支持(非常遗憾...)。
关于这个类做什么的更多细节:它使用CUrl library在互联网上检索一个XML文件,然后继续使用pugixml库解析它。
【问题讨论】:
-
你通过
valgrind运行你的程序了吗? -
这几乎可以肯定是由于
MyObject的构造函数、析构函数或两者中的错误。请出示相关代码。 -
MyObject obj = new MyObject("some string arg");甚至无法编译。请张贴您的实际代码。看起来“大致”类似于导致问题的代码不会帮助我们帮助您解决问题。 -
我删除了
c标签。这不可能是 C。 -
@Gui13:那么,我们什么时候才能看到你的
MyObject定义?