debugging 是否有用于检索转储的module_name的Windbg命令?

x0fgdtte  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(131)

我正在使用windbg,使用我在互联网上找到的一个脚本,来研究C++应用程序的转储文件。
该脚本启动两个命令:一个用于确定转储中存在的所有符号(至少我是这么认为的),一个用于显示所有变量的内存地址和类型。
第一道命令:x /2 *!*
结果包含如下条目:

0042da68          <application>!CMap<int,int,CStringArray *,CStringArray *>
...
74c06448          mfc110u!CStringArray

第二个命令更为复杂,并给出以下结果:

006cabe0    <application>!CMap<int,int,CStringArray *,CStringArray *>
...
006f0280    mfc110u!CStringArray

我对CMapCStringArray对象的大小很感兴趣,因此我启动以下命令:

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命令来了解我正在调查的转储的应用程序吗?

kkih6yb8

kkih6yb81#

可以使用|找到正在调试的可执行文件:

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的输出中,我们可以看到有与模块相关的地址,如果我们能够将入口点Map到特定的模块,我们就有了解决方案。
幸运的是,$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__

相关问题