是否有用于检索转储的 module_name 的 Windbg 命令?
Is there a Windbg command for retrieving the module_name of a dump?
我正在使用 windbg
,使用我在 Internet 某处找到的脚本来调查转储文件。
该脚本启动两个命令:一个用于确定转储中存在的所有符号(至少我是这么认为的),另一个用于显示所有变量的内存地址和类型。
第一个命令:x /2 *!*
结果包含如下条目:
0042da68 <application>!CMap<int,int,CStringArray *,CStringArray *>
...
74c06448 mfc110u!CStringArray
第二条命令比较复杂,结果如下:
006cabe0 <application>!CMap<int,int,CStringArray *,CStringArray *>
...
006f0280 mfc110u!CStringArray
我对 CMap
和 CStringArray
对象的大小感兴趣,因此我将启动以下命令:
dt <application>!CMap<int,int,CStringArray *,CStringArray *> m_nCount 006cabe0
dt <application>!CStringArray m_nSize 006f0280
这工作正常,我得到了我需要的信息。
这似乎也工作正常:
dt CStringArray m_nSize 006f0280
但是这个失败了:
dt CMap<int,int,CStringArray *,CStringArray *> m_nCount 006cabe0
这意味着我需要获取转储文件的应用程序名称(在某些格式化过程中它似乎消失了)。
我可以使用 !analyze -v
命令检索它(在 MODULE_NAME
上执行 grep
),但是仅仅为了获取应用程序的名称这看起来是一个可怕的负担。
有人知道我需要 运行 的 windbg
命令才能了解我正在调查的转储的应用程序吗?
正在调试的可执行文件可以通过 |
:
找到
0:000> |
. 0 id: 13ac create name: C:\Program Files (x86)\Notepad++\notepad++.exe
但是,该可执行文件名称可能与其模块名称有很大不同:
0:000> lm m note*
Browse full module list
start end module name
01150000 013bf000 notepad__ (no symbols)
从lm
的输出中,我们可以看到有地址与模块相关联。如果我们能够将入口点映射到特定模块,我们就会有一个解决方案。
幸运的是,$exentry
为我们提供了入口点,lm
接受了带有 lm a <address>
的地址,所以我们有:
0:000> lm a $exentry
Browse full module list
start end module name
01150000 013bf000 notepad__ (no symbols)
这仍然需要大量的解析,但您也可以使用 lm 1m
方法:
0:000> lm 1ma $exentry
notepad__
我正在使用 windbg
,使用我在 Internet 某处找到的脚本来调查转储文件。
该脚本启动两个命令:一个用于确定转储中存在的所有符号(至少我是这么认为的),另一个用于显示所有变量的内存地址和类型。
第一个命令:x /2 *!*
结果包含如下条目:
0042da68 <application>!CMap<int,int,CStringArray *,CStringArray *>
...
74c06448 mfc110u!CStringArray
第二条命令比较复杂,结果如下:
006cabe0 <application>!CMap<int,int,CStringArray *,CStringArray *>
...
006f0280 mfc110u!CStringArray
我对 CMap
和 CStringArray
对象的大小感兴趣,因此我将启动以下命令:
dt <application>!CMap<int,int,CStringArray *,CStringArray *> m_nCount 006cabe0
dt <application>!CStringArray m_nSize 006f0280
这工作正常,我得到了我需要的信息。
这似乎也工作正常:
dt CStringArray m_nSize 006f0280
但是这个失败了:
dt CMap<int,int,CStringArray *,CStringArray *> m_nCount 006cabe0
这意味着我需要获取转储文件的应用程序名称(在某些格式化过程中它似乎消失了)。
我可以使用 !analyze -v
命令检索它(在 MODULE_NAME
上执行 grep
),但是仅仅为了获取应用程序的名称这看起来是一个可怕的负担。
有人知道我需要 运行 的 windbg
命令才能了解我正在调查的转储的应用程序吗?
正在调试的可执行文件可以通过 |
:
0:000> |
. 0 id: 13ac create name: C:\Program Files (x86)\Notepad++\notepad++.exe
但是,该可执行文件名称可能与其模块名称有很大不同:
0:000> lm m note*
Browse full module list
start end module name
01150000 013bf000 notepad__ (no symbols)
从lm
的输出中,我们可以看到有地址与模块相关联。如果我们能够将入口点映射到特定模块,我们就会有一个解决方案。
幸运的是,$exentry
为我们提供了入口点,lm
接受了带有 lm a <address>
的地址,所以我们有:
0:000> lm a $exentry
Browse full module list
start end module name
01150000 013bf000 notepad__ (no symbols)
这仍然需要大量的解析,但您也可以使用 lm 1m
方法:
0:000> lm 1ma $exentry
notepad__