在windbg中使用Logger.exe来打印方法调用

时间:2012-04-26 17:33:40

标签: c# logging windbg sos

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

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

但是我无法在sampleapplication.dll中看到方法调用。我该怎么做?

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

我该怎么做?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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我是等价的:它们会产生一个完全空的包含列表。

扩展名!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

答案 2 :(得分: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