繁体   English   中英

从C#调试C ++ dll

[英]Debug C++ dll from C#

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

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

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

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

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

在此输入图像描述

您可以看到blob数据结构为空, DataParser (它显示内部有0个项目,而在上面的代码中,您可以看到有多个项目被添加到其中)。

我真的很感激一些帮助,这里出了什么问题? 而我可能在哪里做错了。 如何调试此C ++ DLL,以便我还可以看到当前为其变量分配的值?

也许我调试这个C ++ DLL的方法是错误的? 事实上,C#项目正在使用已经创建的DLL,并且我有一个用于创建此DLL的C ++项目 - 事实上它们是分开的,也许它也必须用它做什么?

PS之前,我不得不做出样改变这种以C ++项目和更低的工具集,因为我使用VS2012(才怪项目是使用VS2013虽然创建,因为我认为这是旧的项目)。 该项目还使用了大量手动编写的其他C ++类。 也许这也是问题而且不知何故编译器无法检索它们的值和定义?

在像我这样的设置中调试C ++ DLL文件的一般步骤是什么?

编辑 :PPS。 还有一些我见过的有趣事实。 例如,如果我在DataParser.Add函数上单击F11(Step into),不一定我被带到该函数的主体,它向我显示了其他函数的主体(可能与它有某种关系)。

此外,如果我在第一次调用Request.Add后按F10说,它会跳过多个Request.Add行,例如移到第五行。

编辑2在我进入C ++代码之前,它向我显示警告“源的版本与用于创建DLL的版本不同”。 这是一个问题吗?

模块和PDB

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

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

PDB和来源

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

因此,源可能已经改变,并且行号甚至可能不再大致匹配。 线号被破坏有几个原因。 我之前回答了类似的问题,并列出了行号更改的以下原因,尽管代码本身没有改变:

  • 代码重新格式化,例如,通过可见性对方法进行排序,从而移动完整的方法
  • 代码重新格式化,例如将长行以80个字符分隔,通常这会使事情变得迟钝
  • 优化使用(R#),删除30行不需要的进口,因此事情向上移动
  • 插入评论或换行符

如何调试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM