我有一个奇怪的问题,我不知道如何调试:
我有以下(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 指针)都切换为 null。当我尝试继续时,我当然会遇到段错误...
所以我的问题是:这可能是什么问题?调用者在被调用者之外的另一个库中,但这些库是静态链接的(并且所有内容都使用相同的编译器编译)。
gcc 版本是 4.6.1。有谁知道我可以从哪里开始调试?
谢谢你的帮助!