windbg
2015-08-10 17:37
232 查看
windbg
1.基本概念:DUMP文件
.DUMP文件,也可以叫CORE文件,或者叫进程内存镜像,或者叫转存文件。
.进程的整个内存在某一时刻的镜像。
.通常是在程序异常终了时自动生成,或使用工具从运行中的进程中获取的,反映该进程的一个内存映象(同时加上调试信息),主要是用来调试的。
2 产生dump文件
windows7之后可以通过注册表,来制定dump文件输出路径和dump文件类型
要开启这个功能需要进行如下配置
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpFolder"="c:\\dumpfile"
"DumpType"=dword:00000002
3 符号库的设置
SRV*E:\windbg\Symbol\SysSymbol*http://msdl.microsoft.com/download/symbols;srv*;E:\windbg\Symbol\UserSymbol
srv*表示是符号服务器,使用了一些复杂ID作为版本标识。对于microsoft的符号文件,使用srv*是没有问题的。对于应用程序符号文件夹,一般不要用srv*,否则导致找不到符号文件。除非使用symstore建立了应用符号服务器。关于symstore参考相关文档
4 WindDbg主要以命令方式工作,主要有三类命令:标准命令,元命令和扩展命令。
标准命令
标准命令用来提供适用于所有调试目标的基本调试功能。
所有基本命令都是实现在WinDBG内部的, 执行这些命令时不需要加载任何扩展模块。大多数标准命令是一两个字符或者符号, 只有version等少数命令除。标准命令的第一个字符是不分大小写的, 第二个字符可能区分大小写。迄今为止, WinDBG调试器共实现了130多条标准命令, 分为60多个系列。为了便于记忆, 可以根据功能将标准命令归纳为如下18个子类。
5 用户态调试(命令详情)
!peb
查看进程环境信息,可查看进程所有模块的基地址。
ln
将地址转化成符号,如函数名。
uf
反汇编并显示汇编代码 。
例子:.结合SysLog 定位
System log中
障害が発生しているモジュール名: NvPROBaseAPIMgr.dll、
バージョン: 4.0.0.7、タイム スタンプ: 0x4d5332cb
例外コード: 0xc0000005
障害オフセット: 0x00042ec0
首先找到崩溃模块基地址
0:000> !peb
略
1130000 4d5332cb Feb 10 08:35:23 2011 C:\Program Files\NEC\UMF\Operations\Manager\bin\NvPROBaseAPIMgr.dll
略
通过基地址加偏移地址找到在该模块的哪个位置
0:000> ln 1130000+00042ec0
e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c(78)
(01172eb0) NvPROBaseAPIMgr!nvdFree+0x10 | (01172f30)
NvPROBaseAPIMgr!nvdAlloc
通过反汇编以及起始地址加偏移查看具体哪个语句出错
0:000> uf NvPROBaseAPIMgr!nvdFree
NvPROBaseAPIMgr!nvdFree [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 73]:
73 01172eb0(***) 56 push esi
76 01172eb1 8b742408 mov esi,dword ptr [esp+8]
76 01172eb5 85f6 test esi,esi
76 01172eb7 7452 je NvPROBaseAPIMgr!nvdFree+0x5b (01172f0b)
NvPROBaseAPIMgr!nvdFree+0x9 [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 76]:
76 01172eb9 57 push edi
76 01172eba 8d9b00000000 lea ebx,[ebx]
NvPROBaseAPIMgr!nvdFree+0x10(***) [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 78]:
78 01172ec0(***) f6460801 test byte ptr [esi+8],1
78 01172ec4 8b3e mov edi,dword ptr [esi]
78 01172ec6 7409 je NvPROBaseAPIMgr!nvdFree+0x21 (01172ed1)
NvPROBaseAPIMgr!nvdFree+0x18 [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 79]:
79 01172ec8 8b4610 mov eax,dword ptr [esi+10h]
79 01172ecb 50 push eax
79 01172ecc e804e4fbff call NvPROBaseAPIMgr!ILT+720(_nvcMemFree (011312d5)
略
通过e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c(78)
70 //jc dnode のリストを開放する
71 DWORD WINAPI
72 nvdFree(LPNVDNODE dphead)
73 {
74 LPNVDNODE dp, nextdp;
75
76 for (dp = dphead; dp; dp = nextdp) {
77 nextdp = dp->dn_dnext;
78 if (dp->dn_option & DN_COMPNAME) { ★ここでコアダンプ★
79 (void) nvcMemFree(dp->dn_compname);
80 }
81 略
96 }
1.基本概念:DUMP文件
.DUMP文件,也可以叫CORE文件,或者叫进程内存镜像,或者叫转存文件。
.进程的整个内存在某一时刻的镜像。
.通常是在程序异常终了时自动生成,或使用工具从运行中的进程中获取的,反映该进程的一个内存映象(同时加上调试信息),主要是用来调试的。
2 产生dump文件
windows7之后可以通过注册表,来制定dump文件输出路径和dump文件类型
要开启这个功能需要进行如下配置
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpFolder"="c:\\dumpfile"
"DumpType"=dword:00000002
3 符号库的设置
SRV*E:\windbg\Symbol\SysSymbol*http://msdl.microsoft.com/download/symbols;srv*;E:\windbg\Symbol\UserSymbol
srv*表示是符号服务器,使用了一些复杂ID作为版本标识。对于microsoft的符号文件,使用srv*是没有问题的。对于应用程序符号文件夹,一般不要用srv*,否则导致找不到符号文件。除非使用symstore建立了应用符号服务器。关于symstore参考相关文档
4 WindDbg主要以命令方式工作,主要有三类命令:标准命令,元命令和扩展命令。
标准命令
标准命令用来提供适用于所有调试目标的基本调试功能。
所有基本命令都是实现在WinDBG内部的, 执行这些命令时不需要加载任何扩展模块。大多数标准命令是一两个字符或者符号, 只有version等少数命令除。标准命令的第一个字符是不分大小写的, 第二个字符可能区分大小写。迄今为止, WinDBG调试器共实现了130多条标准命令, 分为60多个系列。为了便于记忆, 可以根据功能将标准命令归纳为如下18个子类。
5 用户态调试(命令详情)
!peb
查看进程环境信息,可查看进程所有模块的基地址。
ln
将地址转化成符号,如函数名。
uf
反汇编并显示汇编代码 。
例子:.结合SysLog 定位
System log中
障害が発生しているモジュール名: NvPROBaseAPIMgr.dll、
バージョン: 4.0.0.7、タイム スタンプ: 0x4d5332cb
例外コード: 0xc0000005
障害オフセット: 0x00042ec0
首先找到崩溃模块基地址
0:000> !peb
略
1130000 4d5332cb Feb 10 08:35:23 2011 C:\Program Files\NEC\UMF\Operations\Manager\bin\NvPROBaseAPIMgr.dll
略
通过基地址加偏移地址找到在该模块的哪个位置
0:000> ln 1130000+00042ec0
e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c(78)
(01172eb0) NvPROBaseAPIMgr!nvdFree+0x10 | (01172f30)
NvPROBaseAPIMgr!nvdAlloc
通过反汇编以及起始地址加偏移查看具体哪个语句出错
0:000> uf NvPROBaseAPIMgr!nvdFree
NvPROBaseAPIMgr!nvdFree [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 73]:
73 01172eb0(***) 56 push esi
76 01172eb1 8b742408 mov esi,dword ptr [esp+8]
76 01172eb5 85f6 test esi,esi
76 01172eb7 7452 je NvPROBaseAPIMgr!nvdFree+0x5b (01172f0b)
NvPROBaseAPIMgr!nvdFree+0x9 [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 76]:
76 01172eb9 57 push edi
76 01172eba 8d9b00000000 lea ebx,[ebx]
NvPROBaseAPIMgr!nvdFree+0x10(***) [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 78]:
78 01172ec0(***) f6460801 test byte ptr [esi+8],1
78 01172ec4 8b3e mov edi,dword ptr [esi]
78 01172ec6 7409 je NvPROBaseAPIMgr!nvdFree+0x21 (01172ed1)
NvPROBaseAPIMgr!nvdFree+0x18 [e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c @ 79]:
79 01172ec8 8b4610 mov eax,dword ptr [esi+10h]
79 01172ecb 50 push eax
79 01172ecc e804e4fbff call NvPROBaseAPIMgr!ILT+720(_nvcMemFree (011312d5)
略
通过e:\nvp\si\build\si\src\lib\nvprobaseapi\dalloc.c(78)
70 //jc dnode のリストを開放する
71 DWORD WINAPI
72 nvdFree(LPNVDNODE dphead)
73 {
74 LPNVDNODE dp, nextdp;
75
76 for (dp = dphead; dp; dp = nextdp) {
77 nextdp = dp->dn_dnext;
78 if (dp->dn_option & DN_COMPNAME) { ★ここでコアダンプ★
79 (void) nvcMemFree(dp->dn_compname);
80 }
81 略
96 }