当前位置: 首页 > news >正文

Ctrl+F5运行崩溃,而用F5调试运行没有问题

 

     在使用ODE物理引擎和Direct3d做了一个程序后发现经常出现在调试程序时用Ctrl+F5运行出错,而用F5调试运行没有问题的情况,定位错误实在是难找,很简单的程序,不知道,到底是哪里出了问题,导致的程序崩溃。

    崩溃时的出错信息:

    这时,点对话框上的调试,虽然能进入到VC的调试器中,但仍显示程序正在运行,无法定位错误。

 

 

后来将物理引擎的初始化放在其它所有的初始化后面,这个问题就没有了,现在还不知道是什么原因。

所以,我想还得找找ntdll.dll的符号表,要不,再出这个问题也没法在VC2008下调试啊。

 

下面这篇文章是转来的:

使用microsoft symbol server 获取调试符号文件(转)

http://hi.baidu.com/ever_ldd/blog/item/52eac6ed31348e1bfdfa3c0f.html

      在VS中调试程序的时候,不可避免会遇到系统DLL文件的调用,比如Ntdll.dll、kernel32.dll等,但是这些系统文件在本地是没有调试信息的,所以在call stack window中经常会看类似 ntdll.dll!7c92e01b()的条目,我们知道这是一个函数,但看不出函数的名称。只能看出这个函数所在的DLL文件的名称,以及该函数在dll文件中的位置,此时可以设置VS的选项Load DLL Exports,从而可以获得DLL文件导出的文件的名称。ntdll.dll!7c92e01b()将被显示为ntdll.dll!NtQueryInformationProcess(),我们得到了函数名称。但是这只能到DLL文件的导出函数一级,对于DLL中的非导出函数VS仍然不能获得函数名,因为DLL导出表中没有DLL内部函数的调试信息。关于Load DLL Exports的说明参考附录A。

Microsoft提供了Symbol Server用于解决这类的问题,在该服务器上提供了Windows和.Net等各类Microsoft的产品的Symbol,也就是pdb文件,有了这些文件,我们就能很容易地定位code了,也能看到系统dll文件内部的函数的名称了。

在《How to use a symbol server with the Visual Studio .NET debugger》http://support.microsoft.com/default.aspx?scid=kb;en-us;319037

和《使用 Microsoft Symbol Server 获取调试符号文件》http://support.microsoft.com/kb/311503/这两篇文章中介绍了symbol server的使用方法。

总结一下:

1. Microsoft使用了 Symbol Server 技术。Microsoft Symbol Server 是使用 Debugging Tools for Windows 软件包附带的 SymSrv 技术 (SymSrv.dll) 构建的。SymSrv 会生成本地符号高速缓存,以进行快速、自动的符号解析。在支持该技术的IDE的执行目录下可以找到SymSrv.dll文件,比如在C:\Program Files\Microsoft Visual Studio 8\Common7\IDE目录下就存在SymSrv.dll文件。如果启用了Symbol Server 技术。则在调试的过程中SymSrv将会根据当前加载的DLL自动从微软的服务器上下载对应的Symbol文件,并保存到本地指定的目录中,以备调试使用。

2. 在IDE中启用Symbol Server技术。启用的过程就是指定Symbol文件路径的过程。在VS.NET2003中有三种设置的方法:

(1)、通过在系统中添加_NT_SYMBOL_PATH环境变量的方式设置Symbol全局可用。

如果在 _NT_SYMBOL_PATH 环境变量中提供了正确的 symsrv 语法,常见的 Microsoft 调试工具就会使用 SymSrv 技术。这些工具会自动包括您在该变量中提供为符号路径的任何内容。例如:

Set _NT_SYMBOL_PATH = symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols

(2)、只供某个解决方案使用。在解决方案的属性?“Common Properties”?“Debug Symbol Files”中添加一个新的Symbol File的路径,比如:symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols。

(3)只供某个工程使用。在工程的属性页?“Debugging”?“Symbol Path”一栏中添加Symbol File文件的路径,比如symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols。

在VS2005中的设置方法不同:在2005中是通过“工具”?“选项”?“调试”?“符号”来设置Symbol File的路径的。参考附录B。

3. 启动Symbol Server之后,第一次调试的时候,IDE将要从Server上下载调试信息,所以第一次调试的时候速度将会比较慢。为此微软提供了一个工具SymChk.exe用于下载Symbol文件到本地机器。SymChk.exe的使用方法参考附录D。

附录A:MSDN中关于Load DLL Exports的说明

若要访问“本机”页,请单击“工具”菜单并选择“选项”。在“选项”对话框中,展开“调试”节点并选择“本机”。该页允许为调试本机应用程序设置下列选项。

加载 DLL 导出

选定后,加载 DLL 导出表。处理 Windows 98 系统 DLL、Windows 消息、Windows 过程 (WindowProc)、COM 对象、封送或任何您不具有其符号的 DLL 时,DLL 导出表中的符号信息很有用。读取 DLL 导出信息需要一些开销,因此该功能默认情况下是关闭的。

若要查看 DLL 导出表中的可用符号,请使用 dumpbin /exports。符号可用于任何 32 位系统 DLL。通过阅读 dumpbin /exports 输出,可以查看到精确的函数名,包括非字母数字字符。这对于在函数上设置断点很有用。DLL 导出表中的函数名在调试器的其他位置可能似乎被截断了。调用将按调用顺序列出,当前函数(嵌套最深的函数)位于顶部。有关更多信息,请参见 dumpbin /exports。

附录B:VS2005 MSDN中《如何:指定一个符号路径》

为调试代码,调试器需要包含应用程序的符号的 PDB 文件(或旧格式的 DBG 文件)。默认情况下,调试器在与 EXE 或应用程序相同的位置查找这些文件。

如果需要调试系统或第三方 DLL,则还必须通知调试器这些 DLL 的 PDB 或 DBG 文件的所在位置,所以必须指定这些 DBG 或 PDB 文件的所在路径以便调试器可以找到它们。

向符号文件(.pdb 或 .dbg)位置列表添加路径名

1. 从“工具”菜单中选择“选项”。

2. 在“选项”对话框中,单击“调试”节点将其打开。

3. 在“调试”下,选择“符号”类别。

4. 在“符号”页上有一个显示“符号文件 (.pdb) 位置”的框。该框上方有四个图标。单击文件夹图标,可编辑文本即出现在“符号文件 (.pdb) 位置”框中。

5. 编辑文本以添加新的路径名。语句完成功能有助于获得正确的格式。

6. 确保“只在手动加载符号时搜索上述位置”未被选中,除非在调试时要手动加载符号。

7. 如果要使用远程符号服务器上的符号,通过指定一个可将符号复制到其中的本地目录,您将能够提高性能。为此,请使用“将符号从符号服务器缓存到此目录”框。注意,如果正在调试远程计算机上的程序,则缓存目录是指远程计算机上的目录。

8. 单击“确定”。

附录C:VS2005 MSDN中《如何:使用符号服务器》

可以使用符号服务器以允许 Visual Studio 自动下载用于调试 Visual Studio 项目的正确符号。

Microsoft 为开发人员维护了一台公共符号服务器,地址是 http://msdl.microsoft.com/download/symbols。此服务器仅用于符号下载。它是不可浏览的。此服务器为各种操作系统(如 Windows NT 4.0、Windows 2000、Windows XP 和 Windows Server 2003)以及 MDAC、IIS、ISA 和 .NET Framework 提供符号。

另外,您也可以将本地符号服务器安装在 Intranet 上或本地计算机上。

若要使用符号服务器,请按照下面的过程的描述,在 Visual Studio 选项中指定服务器的路径。

可以从“选项”对话框中的“符号文件 (.pdb) 位置”列表中移除路径。

设置符号服务器的路径

1. 在“调试”菜单上,单击“选项”。

2. 在“选项”对话框中打开“调试”节点,然后单击“符号”。

3. 编辑文本以添加符号服务器的新路径。

若要使用 Microsoft 公共符号服务器,请输入: http://msdl.microsoft.com/download/symbols

若要使用 Intranet 符号服务器,请输入:\\server\path\symbols

若要使用本地计算机上的符号服务器,请输入:c:\path\symbols

4. 确保“只在手动加载符号时搜索上述位置”未被选中,除非在调试时要手动加载符号。

5. 如果使用远程符号服务器上的符号,通过指定符号能够复制到的本地目录可以提高性能。若要执行此操作,请在“将来自符号服务器的符号缓存至此目录”框中输入一个路径。若要连接至 Microsoft 公共符号服务器,您需要启用此设置。注意,如果在远程计算机上调试程序,缓存目录指的是远程计算机上的目录。

6. 单击“确定”。

7. 如果使用的是 Microsoft 公共符号服务器,则会出现“最终用户许可协议”对话框。单击“是”可接受该协议并将符号下载至本地缓存。

附录D:使用 SymChk.exe 实用工具下载符号

您可以使用 SymChk.exe 实用工具,验证符号并以便捷、非侵入的方式生成本地符号高速缓存。SymChk.exe 实用程序随 Debugging Tools for Windows 软件包提供。SymChk.exe 是一种命令行工具。您可能需要将 Debugging Tools for Windows 软件包的文件夹添加到系统上的 PATH 环境变量,以便从任意命令提示符下访问该工具。

要使用 SymChk.exe 实用程序下载 Windows\System32 文件夹中所有组件的符号文件,请使用以下命令行命令:

symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols

在此示例中:

• “/r c:\windows\system32”查找 System32 文件夹和所有子文件夹中的所有符号文件。

• “/s SRV*c:*http://msdl.microsoft.com/download/symbols”指定用于符号解析的符号路径。在此例中,“c:\symbols”是将在其中从符号服务器复制符号的本地文件夹。

要获取 SymChk.exe 命令行选项的更多信息,请在命令提示符下键入 symchk /?。其他选项包括指定正在运行的可执行文件的名称或进程 ID (PID) 的功能。

转载于:https://www.cnblogs.com/resound/archive/2010/10/13/1850140.html

相关文章:

  • 我的关节炎给我的提示
  • Oracle基于时间点的恢复(转载)
  • 内核读写只读内存方法总结[Delphi描述][转帖]
  • Delphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop
  • 围棋 资料下载网站
  • CImageList用法介绍 (zz)
  • BAT教程 :第六节(if命令讲解)
  • 从数据库中得到合适的时间格式
  • 大型网站架构演变和知识体系,good job
  • 十个开源的Javascript框架
  • Xtreme Toolkit Pro 安装编译详解
  • WPF程序设计指南:Style
  • 静态方法(Static)到底该不该用?
  • JS 简单的2级下拉框
  • 使用Windows 7中的库
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • C# 免费离线人脸识别 2.0 Demo
  • const let
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HTTP中GET与POST的区别 99%的错误认识
  • js中forEach回调同异步问题
  • mysql外键的使用
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 半理解系列--Promise的进化史
  • 程序员最讨厌的9句话,你可有补充?
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 前端学习笔记之观察者模式
  • 使用parted解决大于2T的磁盘分区
  • 通过git安装npm私有模块
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 新版博客前端前瞻
  • 赢得Docker挑战最佳实践
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计高校学生选课系统
  • (南京观海微电子)——COF介绍
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)VC++中ondraw在什么时候调用的
  • ***检测工具之RKHunter AIDE
  • .Net 8.0 新的变化
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @RestController注解的使用
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝