调试器无法匹配库中的源代码或步骤代码

时间:2014-07-18 15:04:45

标签: c++ debugging gdb lldb

我正在尝试调试来自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, bt=@0x7fff5fbfe540) at dll.cpp:690
Line number 690 out of range; dll.cpp has 146 lines.
可以在dll.cpp找到

trunk / c5 / dll.cpp,并且只报告了146行ad gdb。

对象在问题行之前是dynamic_cast

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

我使用-O0 -g3从源代码构建了库,所以我认为我最小化了一些/大多数典型问题。

我尝试用不同的编译器(g ++和clang ++)构建库和我的测试程序,我尝试用不同的调试器(gdb和lldb)调试它。但我仍然得到非感性信息,图书馆不能在这个领域踩到。其他方面都可以(在问题发生之前可以看到)。

我也确定我正在使用我的库版本。它使用库的完整路径作为静态lib链接,info shared确认Apple没有潜入动态库。

我需要步DL_PrivateKey_EC<CryptoPP::ECP>::DEREncodePrivateKey看看发生了什么。我认为被调用的函数在eccrypto中,但我想在调试器下看到它。

任何想法如何进行?

1 个答案:

答案 0 :(得分:1)

听起来调试信息中的行表不正确。在Mac OS X上,您可以使用dwarfdump --debug-line appname.dSYM转储行表,或者如果您正在查看特定的目标文件dwarfdump --debug-line dll.o。在lldb中你也可以target modules dump line-table dll.cpp。我的猜测是,从第690行开始,您的dll.cpp内嵌了一个头文件中的某些功能 - 但是该线条可能会错误地忘记从dll.cpp切换到您的头文件。

你似乎不太可能从g ++和clang ++中看到同样的问题。我怀疑至少部分项目没有重建。

fwiw你可以在这里继续调试 - 唯一的问题是调试器在你逐步完成你的方法时不会向你显示源代码。但是你可以继续前进,我希望你能够立刻再次回到你的dll.cpp资源中。