我将简要地告诉你情况。 我有一个C#项目,它使用了一些用C ++创建的DLL。
现在,另外,我还有一个C ++项目,它曾用于创建该DLL。 现在,我想在运行C#项目期间调试C ++ DLL。
我在C#项目中启用了“启用非托管代码调试”。
我开始调试C#项目并同时进入一些功能。 一切似乎都没问题。当我到达属于C ++ DLL的函数时, 它要求提供C ++文件的来源,我不得不浏览我的C ++项目。 (在我认为它抱怨一些.pdb文件之前)。
现在,我也设法进入了C ++函数,但是当我一遍又一遍时,该函数中的一些数据结构似乎没有填充数据,例如,请参见下面的截图
你可以看到blob数据结构是空的,DataParser
也是如此(它显示它里面有0个项目,而在上面的代码中你可以看到有多个项目被添加到它里面。)< / p>
我真的很感激一些帮助,这里出了什么问题?而我可能在哪里做错了。如何调试此C ++ DLL,以便我还可以看到当前为其变量分配了哪些值?
也许我的调试这个C ++ DLL的方法是错误的?事实上,C#项目正在使用已经创建的DLL,并且我有一个用于创建此DLL的C ++项目 - 事实上它们是分开的,也许它也必须用它做什么?
PS之前我不得不像this那样对C ++项目和更低的工具集进行更改,因为我使用了VS2012(如果项目是使用VS2013创建的,那就很奇怪,因为我认为它是旧项目)。该项目还使用了大量手动编写的其他C ++类。也许这也是问题,编译器无法检索它们的值和定义?在我这样的设置中调试C ++ DLL文件的一般步骤是什么?
编辑:PPS。还有一些我见过的有趣事实。例如,如果我在DataParser.Add
函数上单击F11(步入),不一定我被带到该函数的主体,它向我显示其他函数的主体(可能与它有某种关联)。
此外,如果我在第一次调用Request.Add
后按F10说,它会跳过多个Request.Add
行,例如移到第五行。
EDIT2 :在我进入C ++代码之前,它还向我显示“源的版本与用于创建DLL的版本不同”。这是一个问题吗?
答案 0 :(得分:1)
模块(.dll
/ .exe
)与调试数据库(.pdb
)之间存在链接。此链接是通过两个文件中都存在的时间戳和校验和建立的。 Visual Studio会检查这些内容的正确性,否则它会抱怨而不是在断点处停止。
虽然其他调试程序(如WinDbg)具有关闭此功能的命令,但Visual Studio没有这样的功能,需要主动操作(例如Chkmatch)才能关闭checmsum验证。只要你没有使用这样的工具,你的调试符号就可以了。
调试数据库(.pdb
)与源之间也存在链接。此链接由文件名和行号建立。您可以猜测,您的源代码在编译期间不会被修改,因此源代码不包含任何可以验证的校验和或时间戳。
因此,源可能已经改变,行号可能甚至不再匹配。线号被破坏有几个原因。我有answered a similar question before并列出了行号更改的以下原因,尽管代码本身没有改变: