PDB符号文件信息
一、前言
这个方法是通过网上的一些方式自己学习枚举PDB文件信息。
二、代码实现
首先枚举驱动文件,这里用psapi库
#include "psapi.h"
#pragma comment(lib,"psapi.lib")
VOID CEnumPdbDlg::EnumModule()
{
LPVOID drivers[ARRAY_SIZE];
DWORD cbNeeded;
int cDrivers, i;
TCHAR szPath[ARRAY_SIZE] = {};
//获得基地址
if( EnumDeviceDrivers(drivers, sizeof(drivers), &cbNeeded) && cbNeeded < sizeof(drivers))
{
TCHAR szDriver[ARRAY_SIZE];
cDrivers = cbNeeded / sizeof(drivers[]); for (i=; i < cDrivers; i++ )
{
//获得驱动名
if(GetDeviceDriverBaseName(drivers[i], szDriver, sizeof(szDriver)/sizeof(szDriver[])))
{
CString StrAddress;
StrAddress.Format(L"0x%p",drivers[i]);
CString FullModPath;
//驱动完整路径
GetDeviceDriverFileName(drivers[i], szPath, sizeof(szPath)); int n = m_List.InsertItem(m_List.GetItemCount(),szDriver,); //注意这里的i 就是Icon 在数组的位置
m_List.SetItemText(n,,StrAddress);
m_List.SetItemText(n,,szPath);
}
}
}
}
本来想看能不能枚举其他信息,看psapi的导出函数,没有相关函数,那就只能通过驱动方式获得了。
然后通过dbghelp库枚举符号信息,这个库是winddk里面的库
#include <Dbghelp.h>
#pragma comment(lib,"dbghelp.lib")
通过下面几个函数就可以枚举pdb文件信息了
VOID EnumFunc::EnumFuncInformation()
{
std::string strMod;
if(g_BaseAddress==)
{
MessageBox(L"Error",L"Error");
return;
}
SymSetOptions(SYMOPT_DEFERRED_LOADS);
HANDLE hProcess = GetCurrentProcess();
SymInitialize(hProcess, , FALSE);
std::string strSymbolPath;
//枚举的下载地址 这里是自己的保存路径
#if _WIN64
strSymbolPath = "srv*D:\\Study\\Symbols_Win7_X64*http://msdl.microsoft.com/download/symbols";
#else
strSymbolPath = "srv*D:\\Study\\Symbols_WinXP_X86*http://msdl.microsoft.com/download/symbols";
#endif SymSetSearchPath(hProcess, strSymbolPath.c_str()); //在网络上下载符号信息,中间指定了下载目录 std::string strSystemPath = "C:\\Windows\\System32\\"; //这是驱动文件路径
strSystemPath += g_strPath;
HANDLE hSystemFile = CreateFileA(strSystemPath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, , NULL);
DWORD dwFileSize = GetFileSize(hSystemFile, NULL); //获得文件大小
//传入驱动文件路径,驱动基址,驱动大小,这里也不知道哪里用了pdb文件
DWORD64 dwBase = SymLoadModule64(hProcess, NULL,strSystemPath.c_str(), NULL,(DWORD64)g_BaseAddress , dwFileSize);
//枚举所有的函数信息,在回调中显示
SymEnumSymbols(hProcess, dwBase, , EnumSymCallBack, this);
SymUnloadModule64(hProcess, dwBase);
SymCleanup(hProcess); }
BOOL CALLBACK EnumSymCallBack(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{ //回调函数,我这里显示了所有的函数信息
}
下面是代码
http://pan.baidu.com/s/1o86Cm3S
PDB符号文件信息的更多相关文章
- PDB符号文件
一.什么是PDB文件 PDB(Program DataBase),全称为“程序数据库”文件.存储程序的所有调试信息数据.在编译连接时,如果选择了/debug选项或/debug:full选项,则最新的M ...
- PDB符号文件浏览工具介绍
一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...
- 下载微软pdb符号文件
使用symchk.exe 逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...
- 【旧文章搬运】关于windbg搜索符号文件的一点说明
原文发表于百度空间,2010-09-07========================================================================== 本来只是打 ...
- 关于qtcreator+vs2008+CDB调试太卡的问题研究(载入符号表,以及VS调试器的注册表信息)
在刚接触Qt时,对于较大的项目,用qtcreator + vs + cdb 调试时,启动很慢并且单步运行时也经常会出现卡住半分钟以上的情况,一直没有解决.在需要debug的时候大多会在vs2008上安 ...
- windbg是如何搜索符号文件的?
来个样例 我的符号目录设置是: 用我们在windows下调试必须用到的ntdll.dll模块来讲下windbg加载符号文件的过程.windbg加载符号文件时,会首先根据配置的符号目录信息,在本地符号目 ...
- .pdb 文件的内部结构
粗略察看一 下.pdb 文件,会发现在其起始位置存放的是这样一个字符串“Microsoft C/C++ program database 2.00”.可以看出 PDB 是 Program Databa ...
- Oracle12c CDB和PDB数据库的启动与关闭说明
Oracle 12c中,增加了可插接数据库的概念,即PDB,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB). CDB全称为Container Database,中文翻译为数据库容器,PDB ...
- 数据库hang住如何收集信息
数据库hang的时候,建议尽量收集以下信息: 1.hanganalyze和systemstate dumps 2.AWR报告 3.最近的RDA 如果是CDB环境,要确认是CDB级别的hang还是PDB ...
随机推荐
- HDU 4927 大数运算
模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...
- Instruments-查看收集到的数据
由于Xcode调试工具Instruments指南篇幅太长,所以本篇blog继续上篇,介绍对Instruments收集到的数据去分析. 关于数据分析 Instruments不解决你代码中的任何问题,它帮 ...
- LA 5009 (三分法求极值) Error Curves
给出的曲线要么是开口向上的抛物线要么是直线,但所定义的F(x)的图形一定是下凸的. 注意一点就是求得是极小值,而不是横坐标,样例也很容易误导人. #include <cstdio> #in ...
- UVa 10003 (可用四边形不等式优化) Cutting Sticks
题意: 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用. 分析: d(i, j)表示切割第i个切点到第j个切点这段所需的最小费用.则有d(i, j) = ...
- bzoj1355: [Baltic2009]Radio Transmission
将原串看成是循环节的后缀加上若干个循环节,那么考虑每种情况都会发现n-next[n]就是最小循环节.(一开始总输出n...然后发现build_next连调用都没有,%%% #include<cs ...
- Asp.Net读写XML简单方法
xml文件 <?xml version="1.0" encoding="utf-8"?> <book> <title>web ...
- Python用smtplib发送邮件
参照了下面: 1. 先随便照着试试这个: http://blog.csdn.net/zhaoweikid/article/details/1638349 2. 这个写了一个很简洁的代码,看过NO.1就 ...
- JS三级折叠菜单特效 自动收缩其它级
真的很不错!很实用,在IE6.IE7.IE8.FF.chrome等浏览器都正常运行,去掉CSS中 #menu ul中 {height:100px; overflow:auto;} 即可高度自适应 &l ...
- ZOJ 3879 Capture the Flag
以此题纪念我写的第一篇acm博客,第一道模拟:) http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3879 题意非常复杂,感觉 ...
- 一道JAVA经典面试题目的两种解法
题目要求:String s="-1 2 5 78 129 -65 -23";将字符串进行升序排序后输出. 方法一:使用数组进行排序 思路: 1.获取字符串中的数值: 2.将数组 ...