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

符号文件

符号文件介绍

链接应用程序、库、驱动程序或操作系统时,创建 .exe 和 .dll 文件的链接器还会创建多个称为 符号文件 的附加文件。

符号文件保存多个数据,这些数据在运行二进制文件时实际上并不需要,但在调试过程中可能非常有用。

通常,符号文件可能包含:

  • 全局变量

  • 局部变量

  • 函数名称和其入口点的地址

  • 帧指针省略 (FPO) 记录

  • 源行号

其中每个项分别称为一个 符号。 例如,单个符号文件 Myprogram.exe 可能包含几百个符号,包括全局变量和函数名以及数百个局部变量。 通常,软件公司会发布每个符号文件的两个版本:包含 公共符号 和 私有符号 的完整符号文件,以及减少的 (去除只包含公共符号) 文件。 有关详细信息,请参阅 公共和私有符号。

调试时,必须确保调试器能够访问与正在调试的目标关联的符号文件。 实时调试调试崩溃转储文件都需要符号。 你必须获取要调试的代码的正确符号,并将这些符号加载到调试器中。

Windows 符号

Windows 在扩展名为 .pdb(program database,程序数据库) 的文件中保留其符号。

编译器和链接器控制符号格式。 Visual C++ 链接器会将所有符号置于 .pdb 文件中。

Windows 操作系统内置于两个版本中。 免费生成 (或 零售版本) 具有相对较小的二进制文件,并且已 检查的生成 (或 调试版本) 具有更大的二进制文件,代码本身中的调试符号更多。 在 Windows 10 版本1803之前,已检查的生成在 windows 的早期版本上可用。 其中每个生成都有自己的符号文件。 在 Windows 上调试目标时,必须使用与目标上的 Windows 生成匹配的符号文件。

下表列出了标准 Windows 符号树中存在的几个目录:

WINDOWS 符号
Directory包含的符号文件

ACM

Microsoft 音频压缩管理器文件

COM

可执行文件 ( .com)

CPL

控制面板程序

DLL

动态链接库文件 ( .dll)

WINSPOOL.DRV

( 的驱动程序文件。 winspool.drv)

EXE

可执行文件 ( .exe)

SCR

屏幕保护程序文件

SYS

驱动程序文件 ( .sys)

符号路径

符号路径指定 Windows 调试器(WinDbg、KD、CDB、NTST)查找符号文件的位置。 有关符号和符号文件的详细信息,请参阅符号。

一些编译器(如 Microsoft Visual Studio)将符号文件与二进制文件放在同一目录中。 符号文件和选中的二进制文件包含路径和文件名信息。 此信息通常使调试器能够自动查找符号文件。 如果要在生成可执行文件的计算机上调试用户模式进程,并且符号文件仍在其原始位置,则调试器可以在不设置符号路径的情况下定位符号文件。

在大多数其他情况下,必须将符号路径设置为指向符号文件位置。

调试器的符号路径是由多个目录路径组成的字符串,用分号分隔

支持相对路径。 但是,除非始终从同一目录启动调试器,否则应在每个路径之前添加驱动程序号或网络共享。 还支持网络共享。

对于符号路径中的每个目录,调试器将在三个目录中查找。 例如,如果符号路径包含 c:\MyDir 目录,并且调试器正在查找 DLL 的符号信息,则调试器依次查找 c:\MyDir\symbols\dll``c:\MyDir\dll``c:\MyDir。 然后,调试器对符号路径中的每个目录重复此过程。 最后,调试器在当前目录中查找,然后在当前目录中附加 ..\dll。 (调试器将附加 ..\dll..\exe 或 ..\sys,具体取决于正在调试的二进制文件。)

符号文件具有日期和时间戳。 不必担心调试器会使用首先在此序列中找到的错误符号。 它始终查找与正在调试的二进制文件上的时间戳匹配的符号。 有关符号文件不可用时的响应的详细信息,请参阅补偿符号匹配问题。

设置符号路径的一种方法是输入 .sympath 命令 。 有关设置符号路径的其他方法,请参阅本主题后面的控制符号路径。

符号服务器

微软提供系统文件的调试符号文件,需要另行下载。

有了这些符号文件,在调试程序的时候,就能看到user32.dll,gdi32.dll等一系列文件的函数名称,否则就显示user32.dll.0x67003246这样的入口地址,

服务器地址:http://msdl.microsoft.com/download/symbols

使用方法:

打开VS2003以上的版本,在调试程序的时候,点击“模块”窗口,可以依次点击模块,右键,加载符号.

还可以直接把同名的pdb文件,放到dll相同的目录,Visual Studio就会自动加载.

相关文章:

  • 浏览器沙箱(sandBox)到底是什么?
  • 渲染
  • URI和URL的区别比较与理解
  • CEF调试Render进程
  • Chrome V8引擎介绍
  • c++中的 extern “C“
  • 中断向量表
  • WM_NCCREATE与WM_CREATE的区别
  • GetWindowLongPtr
  • WNDCLASSEX
  • C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)
  • C++ 虚函数表 vfptr
  • WM_NCHITTEST
  • CreateProcess函数详解
  • CEF类笔记-cef_app
  • ES6指北【2】—— 箭头函数
  • [deviceone开发]-do_Webview的基本示例
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • es6
  • es6(二):字符串的扩展
  • Go 语言编译器的 //go: 详解
  • hadoop集群管理系统搭建规划说明
  • javascript 哈希表
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JDK9: 集成 Jshell 和 Maven 项目.
  • PHP的类修饰符与访问修饰符
  • Redux 中间件分析
  • Theano - 导数
  • 创建一种深思熟虑的文化
  • 分布式熔断降级平台aegis
  • 码农张的Bug人生 - 初来乍到
  • 收藏好这篇,别再只说“数据劫持”了
  • 数据结构java版之冒泡排序及优化
  • 微信小程序:实现悬浮返回和分享按钮
  • 我从编程教室毕业
  • 昨天1024程序员节,我故意写了个死循环~
  • ###C语言程序设计-----C语言学习(6)#
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (python)数据结构---字典
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm高校实验室 毕业设计 800008
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (生成器)yield与(迭代器)generator
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)平衡树
  • ***通过什么方式***网吧
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调