zoukankan      html  css  js  c++  java
  • 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) 的功能。

  • 相关阅读:
    Java NIO3:缓冲区Buffer
    Java NIO2:NIO概述
    Mybatis学习总结(六)——高级映射(一对一,一对多,多对多)
    Java NIO1:浅谈I/O模型
    Java多线程(三)—— synchronized关键字详解
    Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
    Java IO(四)——字符流
    mysql 实现树形的遍历
    Java IO(三)——字节流
    使用 SVN Hook 实现服务器端代码自动更新
  • 原文地址:https://www.cnblogs.com/resound/p/1850140.html
Copyright © 2011-2022 走看看