【问题标题】:Debugger can't match source or step code in library调试器无法匹配库中的源代码或步骤代码
【发布时间】:2014-07-18 15:04:44
【问题描述】:

我正在尝试调试来自 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)对其进行调试。但我仍然得到无意义的信息,图书馆不能踏入这方面。其他区域都OK(可以看到之前的issue)。

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

我需要去DL_PrivateKey_EC&lt;CryptoPP::ECP&gt;::DEREncodePrivateKey 看看发生了什么。我认为被调用的函数在eccrypto 中,但我想在调试器下查看它。

任何想法如何进行?

【问题讨论】:

    标签: c++ debugging gdb lldb


    【解决方案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++ 中看到相同的问题。我怀疑您的项目至少有一部分没有重建。

    您可以在此处继续调试——唯一的问题是调试器不会在您逐步执行方法时向您显示源代码。但是你可以继续前进,我希望你很快就会再次回到你的 dll.cpp 源中。

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 2017-06-29
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2021-04-05
      • 2018-01-30
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多