这个指针和所有参数在调用之后都是空的(但在调用之前是ok的)



我有一个奇怪的问题,我不知道如何调试:

我有以下(c++ 11)类方法:

void RamCloud::write(uint32_t tableId, uint64_t id, const void* buf,
                     uint32_t length,
                     uint64_t* version, bool async)
{
    btree::node_cache& cache = btree::node_cache::instance(104857600);
        cache.write(tableId, id, buf, length);
    theCloud->write(tableId, id, buf, length, nullptr, version, async);
}

(不要太在意代码的作用,在这里并不重要)。

大多数情况下这是有效的,但有一种情况它确实失败了。如果我使用gdb在最后一行中断,我可以做以下操作:

(gdb) p theCloud
$3 = (RAMCloud::RamCloud *) 0x7fbe14009e90
(gdb) p tableId
$5 = 3
(gdb) p id
$6 = 3
(gdb) p buf
$7 = (const void *) 0x7fbe253a22d0
(gdb) p length
$8 = 31496
(gdb) p version
$9 = (uint64_t *) 0x0
(gdb) p async
$10 = false
(gdb) s
#0  0x00007fbe220344aa in RAMCloud::RamCloud::write (this=0x0, tableId=0, id=0, buf=0x0, length=0, rejectRules=0x0, version=0x0, async=false) at /local/mpilman/ramcloudarch/ramcloud/src/RamCloud.cc:260
(gdb) p this
$11 = (RAMCloud::RamCloud * const) 0x0
(gdb) p tableId
$12 = 0
(gdb) p id
$13 = 0
(gdb) p buf
$14 = (const void *) 0x0
(gdb) p length
$15 = 0
(gdb) p rejectRules 
$16 = (const RAMCloud::RejectRules *) 0x0
(gdb) p version
$17 = (uint64_t *) 0x0
(gdb) p async
$18 = false

所以在调用之前一切看起来都很好,但是在调用之后,所有的参数(包括this指针)都变为空。当我尝试继续时,我当然得到一个段错误…

所以我的问题是:这里可能有什么问题?调用者在另一个库中,而不是被调用者,但这些库是静态链接的(并且所有内容都使用相同的编译器编译)。

gcc版本是4.6.1。有人知道我可以从哪里开始调试吗?

谢谢你的帮助!

看起来你的堆栈被砸碎了。可以使用*nix上的Valgrind或Windows上的Application Verifier等工具来查找这些内存相关问题的原因。

最新更新