从客户端应用程序调试到动态库

时间:2012-07-06 00:54:15

标签: c++ windows linux dll shared-libraries

假设我在调试模式下编译了一个动态库(Windows DLL和/或Linux共享对象文件.so),供动态链接到它的客户端应用程序使用。我的源代码可供客户端应用程序开发人员使用。

我需要对以下调试方案做一些澄清。我总是理解/假设客户端应用程序调试到我的库中 (例如,为了让客户端应用程序开发人员在调试时进入我的源代码,比如在F10中使用MS VC++),他们必须自己实际构建我的库的本地副本(访问我的源代码),或者至少可以在没有构建源代码的情况下访问我的源代码(不确定是否足够?)。

我是对的吗?换句话说,如果客户端应用程序动态地链接到我自己动态构建的应用程序,我认为它不仅仅足以为库提供调试符号(MS VC ++中的PDB文件)。感谢是否有人可以帮我解决这个问题? Linux的情况怎么样?我的理解再次与上述相同。现在,如果我编译了一个静态库(Windows LIB和/或Linux库.a);我的理解是,他们然后不需要我的源代码的本地构建副本(我还没有尝试过这个)?

我的前提是否正确?如果没有,有人可以提供一些详细的解释,最好是一个例子吗?感谢您的投入。

2 个答案:

答案 0 :(得分:2)

我对Windows的经验比linux更多。但我认为这个概念是相似的。

  

如果客户端应用程序动态链接到我自己动态构建的应用程序。

我不太确定我是否理解“动态构建”。您可能会对dll的动态方面感到困惑? dll在运行时(不是构建时)链接,以允许在没有完整应用程序的情况下部署组件的一部分。例如,只要界面被维护,当Windows更新dll时,Windows上依赖操作系统提供的dll的应用程序不会受到影响。 dll和exe之间的唯一区别是dll的入口函数是dllmain而不是exe中的main。

(我能想到的唯一“动态构建”概念是构建模板化类。但我不认为这就是你的意思。)

因此,调试.dll与调试.exe没有什么不同,只是.dll是来自可执行文件的单独二进制文件。提供的所有源代码都允许调试器将步进与源代码中的行对齐。当源代码不可用时,调试器仍然可以使用符号逐步执行汇编代码。

当情况不允许时,那些擅长阅读汇编代码的开发人员只能使用符号和源代码进行调试。

您通常可以使用优化选项构建二进制文件,然后编译器可能会优化汇编代码,以至于调试器中的源代码对齐可能无法实现。这通常发生在已发布的代码中。在这些情况下,当您单步执行代码时,您有时会看到与您预期的看似不同的行或条件跳转。 .exe,.exe与libs或.dll相同。这可能就是为什么你认为总是需要构建自己的二进制文件来调试dll?

答案 1 :(得分:2)

根据要求,这是我的评论作为答案。由于它只针对Windows方面的问题,任何拥有Linux(或Mac!)部分答案的人都可以自由编辑(我将其标记为社区维基答案)。


对于VC ++,调试构建DLL +匹配PDB +匹配源就是您所需要的。困难的部分是让它们全部匹配; - )

此外,如果源文件与编译DLL时的路径相同,则它可以更顺畅地工作,但是如果您拥有它,Visual Studio也能完全提示您手动浏览源。