从客户端应用程序debugging到dynamic库

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

我需要一些关于以下debugging场景的说明。 我一直理解/假设为了使客户端应用程序debugging到我的库中(例如,为了使客户端应用程序开发人员在debugging时插入我的源代码,例如使用MS VC++ F10 ),他们将拥有实际上已经自己构build了我的库的本地副本(可以访问我的源代码),或者至less可以在本地访问我的源代码而无需构build它(不确定是否足够?)。

我对吗? 换句话说,如果客户端应用程序dynamic链接到自己dynamic构build的应用程序,我认为向库提供debugging符号(MS VC ++中的PDB文件)是不够的。 感谢有没有人能帮我解决这个问题? 如何在Linux的情况? 我的理解和上面一样。 现在,如果我编译了一个静态库(Windows LIB和/或Linux库.a); 我的理解是,他们然后不需要本地生成我的源代码副本(我还没有尝试过这个呢)?

我的前提是否正确? 如果不是的话,有人可以举一个详细的解释吗? 感谢您的input。

按要求,这是我的评论作为答案。 由于它只涉及Windows的一面,任何拥有Linux(或Mac!)部分答案的人都可以自由地编辑(我将其标记为社区wiki答案)。


对于VC ++,调试版本DLL +匹配的PDB +匹配源是您所需要的。 困难的部分是让他们都匹配;-)

此外,如果源文件与DLL编译时的路径相同,则工作更顺利,但Visual Studio也完全能够提示您手动浏览源(如果有)。

我比Windows有更多的使用Windows的经验。 但我会认为这个概念是相似的。

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

我不太确定我是否理解“动态构建”。 你可能会混淆DLL的动态方面? dll在运行时链接(不是编译时),允许在没有完整应用程序的情况下部署组件的一部分。 例如,Windows上依赖操作系统提供的DLL的应用程序不会受到影响,只要维护该接口,Windows就更新该DLL。 一个DLL和EXE的唯一区别是,DLL的入口函数是dllmain而不是主要的EXE。

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

因此,调试.dll与调试.exe没有区别,只是.dll是与可执行文件不同的二进制文件。 所有源代码提供的是允许调试程序与源代码中的行对齐。 当源代码不可用时,调试器仍然可以通过符号来逐步执行汇编代码。

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

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