VS2013 MFC 中DLL链接库断点不能命中的解决方案总结

一、结论

          1. ”当前不会命中断点,因为还没有为该文档加载任何符号”才是要使断点命中的要点;

          2. 方案1是前提,一定要确保DLL是最新的,头文件包含要同步一致;

          3. 按第6条的第一步就解决问题了,其它实验后并无效果。

二、方案

1. https://blog.csdn.net/zhangbinsijifeng/article/details/46328393

(1).要调试的dll不在调试进程的进程空间,调不到,也就是该dll还没有被加载进exe内。即exe还没有使用到dll呢,当然不会加载该dll到exe的进程空间中

(2).exe调用的dll,不是dll源代码生成的最新的dll。一定要确保,exe调用的dll是dll源代码最新生成的dll。

不理解下面这段话中的“现有项目”和“一直在用的DLL”  的具体指代    

 “第一条out了。肯定是第二条。终于想起来了。我引用了三四个项目文件,有的项目文件没有引用“工程”上的现有项目,而是直接引用了一个一直在用的dll。把那个引用删除,然后改成引用到现有项目。”

2. https://blog.csdn.net/cokewei/article/details/50547557

环境:VS2015解决方案中有2个项目,一个项目是C++写的dll源代码,另一个是C#调用这个dll测试。

问题:C#调用dll无法在dll源代码中中断,提示“当前不会命中断点,因为还没有为该文档加载任何符号”

解决:

(1).首先设置dll和测试程序输出路径在同一个目录下

(2).其次设置

        a 项目-〉属性-〉配置属性-〉C/C++-〉常规-〉调试信息格式,这里不能为“禁用”。   

        b项目-〉属性-〉配置属性-〉链接器-〉调试-〉生成调试信息,这里设为“是”。

最后很重要的一点:C#测试程序项目属性-〉调试->启用本机代码调试 打勾

希望对遇到相同问题的人有用。转载请注明出处

3. https://blog.csdn.net/madison_wang/article/details/52174876

把两个工程的配置属性中->调试:调试器类型由自动改为混合

4. https://blog.csdn.net/hnyzyty/article/details/46482077

首先,设置调试工作目录(把图1红框内的路径改为待调试的DLL所在的路径)

之后,切记要把待调试的项目重新生成一次!

5. https://blog.csdn.net/qq_22889875/article/details/79621534

在对C#调用的C++动态库打断点进行调试时,断点变为黄色感叹号,未进入断点,反复查找原因,重新生成的dll文件已经拷贝到C#相关目录下面,但还是无法进入断点,后来发现重新生成的动态库的pdb文件没有拷贝到C#相关目录下面,对动态库进行清理,重新生成解决方案,然后将新生成的dll和pdb同时拷贝到C#相关目录下,调试动态库,断点生效,问题解决。

(release文件夹下才有PDB,而debug模式下没有PDB,因此此方案未试验。)

6.https://blog.csdn.net/shakspers/article/details/78978017

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态链接库是一种可重定位的二进制文件,它包含了一些可供其他程序调用的函数或数据。在 Windows 平台上,动态链接库采用 .dll 后缀名,而在 Linux 平台上则采用 .so 后缀名。在本文,我们将介绍如何使用 MFC 调用 C 语言编写的动态链接库。 # 创建动态链接库 在 Windows 平台上,可以使用 Visual Studio 创建动态链接库。下面是一个简单的示例: ```c // mydll.h #ifndef MYDLL_H #define MYDLL_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) int add(int a, int b); #ifdef __cplusplus } #endif #endif // MYDLL_H // mydll.c #include "mydll.h" int add(int a, int b) { return a + b; } ``` 这个动态链接库包含一个 add 函数,可以对两个整数求和。 # 调用动态链接库MFC 项目调用动态链接库,需要进行以下几个步骤: 1. 定义一个函数指针类型,指向动态链接库的函数。 ```c++ typedef int (*AddFunc)(int, int); ``` 2. 加载动态链接库。 ```c++ HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } ``` 3. 获取动态链接库的函数地址。 ```c++ AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } ``` 4. 调用动态链接库的函数。 ```c++ int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); ``` 5. 卸载动态链接库。 ```c++ FreeLibrary(hinstLib); ``` 完整的 MFC 代码示例: ```c++ typedef int (*AddFunc)(int, int); void CMyDlg::OnButton1() { HINSTANCE hinstLib = LoadLibrary(TEXT("mydll.dll")); if (hinstLib == NULL) { AfxMessageBox(TEXT("Failed to load library.")); return; } AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "add"); if (addFunc == NULL) { AfxMessageBox(TEXT("Failed to get function address.")); FreeLibrary(hinstLib); return; } int result = addFunc(1, 2); CString str; str.Format(TEXT("1 + 2 = %d"), result); AfxMessageBox(str); FreeLibrary(hinstLib); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值