我有一个奇怪的问题,我不知道如何调试:
我有以下(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等工具来查找这些内存相关问题的原因。