从C#调试C ++ dll

时间:2015-10-05 11:32:15

标签: c# c++ debugging dll visual-studio-debugging

我将简要地告诉你情况。 我有一个C#项目,它使用了一些用C ++创建的DLL。

现在,另外,我还有一个C ++项目,它曾用于创建该DLL。 现在,我想在运行C#项目期间调试C ++ DLL。

我在C#项目中启用了“启用非托管代码调试”。

我开始调试C#项目并同时进入一些功能。 一切似乎都没问题。当我到达属于C ++ DLL的函数时, 它要求提供C ++文件的来源,我不得不浏览我的C ++项目。 (在我认为它抱怨一些.pdb文件之前)。

现在,我也设法进入了C ++函数,但是当我一遍又一遍时,该函数中的一些数据结构似乎没有填充数据,例如,请参见下面的截图

enter image description here

你可以看到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的版本不同”。这是一个问题吗?

1 个答案:

答案 0 :(得分:1)

模块和PDB

模块(.dll / .exe)与调试数据库(.pdb)之间存在链接。此链接是通过两个文件中都存在的时间戳和校验和建立的。 Visual Studio会检查这些内容的正确性,否则它会抱怨而不是在断点处停止。

虽然其他调试程序(如WinDbg)具有关闭此功能的命令,但Visual Studio没有这样的功能,需要主动操作(例如Chkmatch)才能关闭checmsum验证。只要你没有使用这样的工具,你的调试符号就可以了。

PDB和来源

调试数据库(.pdb)与源之间也存在链接。此链接由文件名和行号建立。您可以猜测,您的源代码在编译期间不会被修改,因此源代码不包含任何可以验证的校验和或时间戳。

因此,源可能已经改变,行号可能甚至不再匹配。线号被破坏有几个原因。我有answered a similar question before并列出了行号更改的以下原因,尽管代码本身没有改变:

  • 代码重新格式化,例如按可见性对方法进行排序,以便移动完整的方法
  • 代码重新格式化,例如将长行打破80个字符,这通常会使事情发生变化
  • 优化使用(R#),删除30行不需要的导入,因此事情向上移动
  • 插入评论或换行符

如何调试

  1. 如果可以,请恢复该版本的确切源代码。
  2. 完全无需源代码调试,仅通过PDB信息进行调试。通过这种方式,您可以保留二进制组件,如果这很重要(例如,如果只能使用该版本重现错误)
  3. 重建所有模块以使代码再次与模块匹配。这样你就失去了二进制文件,问题可能不再重现了。