2014-07-18 74 views
1

我試圖調試來自Crypto ++庫的一些代碼,但在會話期間我收到了非感性信息。調試器無法匹配庫中的源代碼或步驟代碼

感興趣的功能是DEREncodePrivateKey。它在DL_PrivateKey_EC<T>上的成員函數(Crypto ++大量模板化)。

228  pk.DEREncodePrivateKey(encoder); 
(gdb) s 
non-virtual thunk to CryptoPP::DL_PrivateKey_EC<CryptoPP::ECP>::DEREncodePrivateKey(CryptoPP::BufferedTransformation&) const 
(this=0x7fff5fbfeca0, [email protected]) at dll.cpp:690 
Line number 690 out of range; dll.cpp has 146 lines. 

dll.cpp可以在trunk/c5/dll.cpp可以找到,並且它只有146名報行廣告GDB。

目的是dynamic_cast只是在問題前行:

const PKCS8PrivateKey& pk = dynamic_cast<const PKCS8PrivateKey&>(key); 

我建立從源代碼庫-O0 -g3,所以我想我最小化一些/大部分的典型問題。我試過用不同的編譯器(g ++和clang ++)構建庫和我的測試程序,並且我試着用不同的調試器(gdb和lldb)調試它。但是我仍然得到非感性的信息,圖書館不能在這個領域走出來。其他方面都可以(在問題出現之前可以看到)。

我也確定我正在使用我的圖書館版本。它被鏈接爲靜態庫,使用庫的完整路徑,並確認蘋果公司並沒有偷偷進入動態庫。

我需要執行DL_PrivateKey_EC<CryptoPP::ECP>::DEREncodePrivateKey以查看發生了什麼。我認爲被調用的函數是在eccrypto,但我想在調試器下看到它。

任何想法如何進行?

回答

1

聽起來像調試信息中的行表不正確。在Mac OS X上,您可以使用dwarfdump --debug-line appname.dSYM轉儲行表,或者您正在查看特定對象文件dwarfdump --debug-line dll.o。從lldb中你也可以做target modules dump line-table dll.cpp。我的猜測是頭文件中的某些函數被內聯到您的dll.cpp - 從第690行開始 - 但是線表可能會錯誤地忘記從dll.cpp切換到您的頭文件。

從g ++和clang ++看來都不會出現同樣的問題。我懷疑你的項目至少有一部分沒有重建。

fwiw您可以在這裏繼續調試 - 唯一的問題是調試器在您逐步執行方法時不會顯示源代碼。但是你可以繼續下去,我希望你能很快回到你的dll.cpp源文件中。