VC2008突然无法下断点的解决方法

时间:2020-12-28 02:18:48

转载文章, 感谢原作者

http://hi.baidu.com/widebright/item/2943b390dc6aa21f924f41c5

 

本来在之前的“vc6.0编译c++程序后在vc2008中调试的奇技淫巧(符号信息和链接)"

http://hi.baidu.com/widebright/blog/item/3262272d34e5002a359bf74d.html?timeStamp=1326769867413

一文里面有提到的了,但昨天还是忘了第一步的,找了好久。再次给自己强化一下记忆。

使用 debug 模式编译,不要用release模式。

如果还是不行,或者想在release版本调试,往下看。

====================================

1. 编译的时候给cl.exe 制定 /ZI 编译选项

在visual studio 里面设置选项。

工程属性 -> C/C++ -> "General" -> Debug Information Format -> Program Database for Edit And Continue

参考

http://msdn.microsoft.com/zh-cn/library/958x11bc(v=vs.100).aspx

/ZI

以支持“编辑并继续”功能的格式产生如上所述的程序数据库。 如果想使用“编辑并继续”调试,则必须使用此选项。 因为大多数优化与“编辑并继续”不兼容,所以使用 /ZI 会禁用代码中的所有 #pragma optimize 语句。

/ZI 会导致在编译中使用 /Gy(启用函数级链接) 和 /FC(所诊断源代码文件的完整路径)。

/ZI 与 /clr(公共语言运行时编译) 不兼容。

---------------------------------------------------

2. 链接的时候给link.exe 制定编译选项 /DEBUG 和 /PDB:filename

工程属性 -》”configuration properties “ -》 “Linker” -》“debugging” -》 “generate program datbase file ”制定了 生成的pdb符号信息文件的具体位置。 “Generate Debug Info” 设置为 yes

解释参考

http://msdn.microsoft.com/zh-cn/library/xe4t6fc1(v=vs.90).aspx

http://msdn.microsoft.com/zh-cn/library/kwx19e36(v=vs.90).aspx

/DEBUG 选项创建 .exe 文件或 DLL 的调试信息。

链接器将调试信息放在程序数据库 (PDB) 中。它在后面的程序生成期间更新 PDB。

为调试创建的 .exe 文件或 DLL 包含相应 PDB 的名称和路径。调试器在您调试程序时读取嵌入的名称并使用 PDB。链接器使用程序的基名称和扩展名 .pdb 命名程序数据库,并嵌入它的创建路径。若要重写该默认值,请设置 /PDB 并指定不同的文件名。

编译器的仅限行号 (/Zd) 或 C7 兼容 (/Z7) 选项使编译器将调试信息保留在 .obj 文件中。还可以使用程序数据库 (/Zi) 编译器选项将调试信息存储在 .obj 文件的 PDB 中。链接器首先在写入 .obj 文件的绝对路径中查找对象的 PDB,然后在包含 .obj 文件的目录中查找。不能指定对象的 PDB 文件名或链接器的位置。

指定 /DEBUG 时暗含 /INCREMENTAL。

/DEBUG 将 /OPT 选项的默认值从 REF 更改为 NOREF 以及从 ICF 更改为 NOICF(因此,需要显式指定 /OPT:REF 或 /OPT:ICF)。

有关 .PDB 和 .DBG 文件的更多信息,请参见知识库文章 Q121366,INFO: PDB and DBG Files - What They Are and How They Work。可以在 MSDN Library 中或 http://support.microsoft.com/default.aspx?ln=zh-cn 上找到知识库文章。

无法创建包含调试信息的 .exe 或 .dll。调试信息始终放在 .pdb 文件中。

在 Visual Studio 开发环境中设置此链接器选项

打开此项目的“属性页”对话框。有关详细信息,请参见设置 Visual C++ 项目属性。

单击“链接器”文件夹。

单击“调试”属性页。

修改“生成调试信息”属性。

以编程方式设置此链接器选项

--------------------------------------------

3.

“attach to process” 或者附加到进程。在“module”窗口里面找到对应的dll,可以看到pdb符号文件是不是加载成功。右键会有“symbol load informations”  “symbol setting” 两个选项。

或者中断后 "call stack"  窗口里面,右键也相应的 dll的函数名 ,会有“symbol load informations”  “symbol setting” 两个选项

这个也会打开第4步的那个窗口。

在这个窗口里面可以手工设置加载自己制定的pdb 符号文件。

如果发现pdb已经找到,但是还没法在制定的源码下断点,请检查前面的第一个第二步的设置,特别是这个 /ZI 选项一定要制定,不然在这个窗口里面看到了pdb已经加载,但却没发下断点,提示没有符号信息。另外如果使用的命令行或者makefile的话的link.exe一定要和visual studio的版本对应,vc 2010就用

用vc2010的link.exe.

-----------------------------------------------

4. “tools” -》 “options” -》 “debugging”  -》 “symbol” 那里可以指定 加载 特定的符号

------------------------------------------

5. 另外vc2008 编辑修改文件后,没法下断点,提示源码行没有匹配的情况。

重新编译一下,如果还不解决问题,好像是个bug,选中文件的所有行,然后利用菜单里面的  edit ——》advance -》 format selection 把该文件的所有的代码都格式化一下。再保存,重新编译就可以了。

( 这里附上网上其它的解决办法

1,将出问题的文件用notepad打开,然后另存为Unicode编码,就可以解决!(试过一两个文件就放弃没全试-因为相当麻烦,不知是否有效)

2将“工具”-“选项”-“调试”,“要求源文件与原始版本完成匹配”去掉勾 或者设置该断点。(试过,这个有效但不推荐,我觉得这不是一个好方法!有能可带来断点地方错乱的问题)

)

------------------------------------------

6. MSDN里面关于pdb文件的说明

PDB Files (C++)

http://msdn.microsoft.com/en-us/library/yd4f8bd1(v=VS.90).aspx