2

我需要 windbg 使用 Logger.exe 打印方法调用。

在分析 Logexts.dll 后,我了解到!logexts.logm i sampleapplication.dll会将 sampleapplication.dll 中的调用打印到 windbg 屏幕上。

但我看不到在 sampleapplication.dll 中进行的方法调用。我怎么做?

假设如果在sampleapplication中有一个方法print(),当这个方法被调用时,它应该打印在windbg屏幕中。

我怎么做?

4

3 回答 3

3

LogExts.dll 扩展将仅记录在 WinDBG 文件夹的 winext\manifest 内的“头”文件中指定的调用。它只能记录本机/非托管调用(即,没有 .NET/托管的东西)。

我是这个工具的原作者……它写于 1999 年,很多清单都反映了当时存在的 Microsoft API。最初的目的是调试第三方应用程序,以找出如何使它们与最终成为 Windows XP 的东西兼容。

于 2013-08-31T19:50:48.380 回答
1

所以你想记录输出到 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
于 2012-04-26T19:54:11.810 回答
0

@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
于 2012-04-28T20:02:13.333 回答