我需要 windbg 使用 Logger.exe 打印方法调用。
在分析 Logexts.dll 后,我了解到!logexts.logm i sampleapplication.dll会将 sampleapplication.dll 中的调用打印到 windbg 屏幕上。
但我看不到在 sampleapplication.dll 中进行的方法调用。我怎么做?
假设如果在sampleapplication中有一个方法print(),当这个方法被调用时,它应该打印在windbg屏幕中。
我怎么做?
LogExts.dll 扩展将仅记录在 WinDBG 文件夹的 winext\manifest 内的“头”文件中指定的调用。它只能记录本机/非托管调用(即,没有 .NET/托管的东西)。
我是这个工具的原作者……它写于 1999 年,很多清单都反映了当时存在的 Microsoft API。最初的目的是调试第三方应用程序,以找出如何使它们与最终成为 Windows XP 的东西兼容。
所以你想记录输出到 WinDbg 输出窗口?使用以下内容:
!logexts.logo e d
这将启用日志记录并应输出到输出窗口
您列出的用于创建模块包含或排除列表(来自 F1 帮助):
!logexts.logm 扩展创建或显示模块包含列表或模块排除列表。
!logexts.logm i Modules
!logexts.logm x Modules
!logexts.logm
参数
i
使 Logger 使用模块包含列表。它将由指定的模块组成。
x
使 Logger 使用模块排除列表。它将由 Logexts.dll、kernel32.dll 和指定的模块组成。
Modules
指定要包含或排除的模块。此列表不是累积的;每次使用此命令都会创建一个全新的列表。如果列出了多个模块,请用空格分隔它们。星号 (*) 可用于表示所有模块。
备注 如果没有参数,!logexts.logm 扩展名会显示当前包含列表或排除列表。
扩展名 !logexts.logm x * 和 !logexts.logm i 是等价的:它们导致一个完全空的包含列表。
扩展名 !logexts.logm i * 和 !logexts.logm x 是等效的:它们会生成一个仅包含 Logexts.dll 和 kernel32.dll 的排除列表。这两个模块总是被排除在外,因为 Logger 不允许记录自己。
这里有些例子:
0:001> !logm
Excluded modules:
LOGEXTS.DLL [mandatory]
KERNEL32.DLL [mandatory]
USER32.DLL
GDI32.DLL
ADVAPI32.DLL
0:001> !logm x winmine.exe
Excluded modules:
Logexts.dll [mandatory]
kernel32.dll [mandatory]
winmine.exe
0:001> !logm x user32.dll gdi32.dll
Excluded modules:
Logexts.dll [mandatory]
kernel32.dll [mandatory]
user32.dll
gdi32.dll
0:001> !logm i winmine.exe mymodule2.dll
Included modules:
winmine.exe
mymodule2.dll
@EdChum:
日志可见。但不是方法调用。
我在表单上有一个按钮。单击该按钮时,我正在调用 method1() 。但是在记录中我只看到这个,
`Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "GetDlgItem") -> 0x77648510
Thrd 1bcc 0012B8A9 GetDlgItem( 0x0001083A 0x00000000) -> NULL [FAIL]
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "IsWindowVisible") -> 0x77656939
Thrd 1bcc 009718E6 IsWindowVisible( 0x0001083C) -> TRUE
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "IsWindowEnabled") -> 0x7764C921
Thrd 1bcc 009718E6 IsWindowEnabled( 0x0001083C) -> TRUE
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "SetCapture") -> 0x77676B2A
Thrd 1bcc 0012BBFE SetCapture( 0x0001083C) -> NULL [FAIL]
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "NotifyWinEvent") -> 0x7765F299
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "InvalidateRect") -> 0x77657BC9
Thrd 1bcc 00972610 InvalidateRect( 0x0001083C [0x0024E88C] -> 0 , 0 , 75 , 23 FALSE) -> TRUE
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "MapWindowPoints") -> 0x77657915
Thrd 1bcc 009726C7 MapWindowPoints( 0x0001083C NULL 0x00000001) -> 16711916 ( [0x01B30B24] -> 286 , 269 )
Thrd 1bcc 00972610 InvalidateRect( 0x0001083C [0x0024E804] -> 0 , 0 , 75 , 23 FALSE) -> TRUE
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "UpdateWindow") -> 0x77652BD9
Thrd 1bcc 009718E6 UpdateWindow( 0x0001083C) -> TRUE
Thrd 1bcc 009726C7 MapWindowPoints( 0x0001083C NULL 0x00000001) -> 16711916 ( [0x01B32AE8] -> 286 , 269 )
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "WindowFromPoint") -> 0x77676D0C
Thrd 1bcc 0012B98C WindowFromPoint( 286 269) -> 0x0001083C
Thrd 1bcc 7243DD89 GetProcAddress( 0x77640000 "ReleaseCapture") -> 0x7764C49E
Thrd 1bcc 0012B11F ReleaseCapture() -> TRUE