无法命中断点 怎么办 进程附加完毕 就是无法命中 之前还好使呢 什么情况
不知道你这个问题是否已经解决, 如果还没有解决的话:如果我们不想在最上层的exe模块进行整体的Release调试,可以只调试某一个模块,只需要在Release下编译一个模块。或者是问题出在底层的模块中,比如组件组的模块、协议组的模块、网络组的模块、音视频编解码组的模块或者是开源组件的模块等,这些组的开发维护人员只需要使用附加调试的方式去调试他们负责的模块。
只需要在机器上安装exe安装包(release版本),他们本地用VS编译一下Release版本的库,将库拷贝到exe程序所在的路径中,然后将exe程序启动起来,这样exe程序使用的就是刚才编译出来的库了。接着在打开库源码的VS中,点击菜单栏中的调试->附加到进程,在弹出的窗口中找到exe进程:
点击附加按钮即可,就可以打断点调试了。
有人可能会问将dll库拷贝到exe路径中,为啥附加调试时可以调试该dll库的源码呢?其实之所以能调试,是因为编译时生成的调试信息都保存到pdb文件中了,编译生成dll时会将本地编译生成的pdb文件的完整路径写到对应的二进制文件中,如下所示:(二进制文件以文本的方式打开会出现乱码,不妨碍查看对应的pdb文件的路径)
对于我们的测试程序TestDlg.exe,我们使用Notepad++打开,以.pdb关键字搜索,就能搜到写入到TestDlg.exe二进制文件中的pdb完整路径:
C:\Users\Administrator\Desktop\TestDlg\Release\TestDlg.pdb,如上所示。
所以,将编译好的dll文件拷贝到exe路径中,VS根据dll库中写入的pdb文件的路径可以找到pdb文件,可以找到调试信息,所以可以在VS中调试源码。
对于附加调试,需要exe程序先启动起来,然后将VS附加到exe进程上调试。但如果问题出现在dll库初始化阶段,程序启动时就会去初始化底层的dll库,如果等程序启动完成后再去附加,时间上可能就晚了,dll库初始化的代码已经跑过了。
这种场景下我们有办法,可以在exe程序main函数的入口处调用API函数MessageBox弹出一个模态框,将代码阻塞住,给附加进程创造一个时机。等进程附加上去后,再点击MessageBox的确定按钮,让exe继续往下跑,调用dll库的初始化接口,这样就能调试到dll库的初始化代码了。这是一个技巧。