デバッグ方法がわからないという奇妙な問題が発生しています。
次の(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);
}
(コードが何をするかはあまり気にしないでください。ここではそれほど重要ではありません)。
ほとんどの場合、これは機能しますが、失敗する場合が1つあります。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です。誰かが私がデバッグを開始できるアイデアを持っていますか?
助けてくれてありがとう!