如何控制多进程调试
How to control multi process debugging
我正在使用 WinDbg 分析 AcroRd32.exe
。 AcroRd32.exe
有2个进程,一个(father-p)启动另一个(child-p)。我使用 .childdbg 1
和 |1s
等命令来调试这两个进程。
我切换到 child-p,然后切换回 father-p,使用条件断点监控 kernel32.dll 的 CreateFileW
和 ReadFile
API。打开 a.pdf
时,只有 CreateFileW
以参数 "C:\a.pdf" 调用。我记得 CreateFileW
的 return 值,文件句柄,使用条件断点来监视 ReadFile
的参数,但是没有调用 ReadFile
与 return CreateFileW
的值。然后随着许多g
命令,令人困惑的事情来了,a.pdf
打开了!
我很困惑。没有调用 ReadFile
,PDF 就打开了。 Acrobat Reader 是怎么做到的?我有两个假设,第一个,它使用一些类似 CreateFileMapping
的 API;另一个(大部分),child-p 成功了。
我们来讨论第二个假设。我在调试father-p的时候,child-p并没有挂起。它是如何打开(读取)文件的?
使用 Rohitab API Monitor 我看到第二个实例使用文件句柄调用 CreateFileW()
和 ReadFile()
:
既然如此,那想必WinDbg中的断点也是一样的吧。如果没有重现问题的确切步骤,我们将无法回答问题所在,例如在你的断点条件下。
当我查看我的演练时,我认为以下可能会出错:
- 您在子进程的条件中使用了父进程的文件句柄,尽管子进程获得了新句柄
- 您在错误的进程上设置了断点。断点是特定于进程的。
- 断点条件中还有其他错误。检查
.if
或 j
命令。
这是我的演练,其中显示已命中断点。我在这里没有使用条件断点。
0:000> bp kernel32!CreateFileW
0:000> .childdbg 1
Processes created by the current process will be debugged
0:000> g
[...]
Breakpoint 0 hit
[...]
0:000> kb L1
# ChildEBP RetAddr Args to Child
00 0045f0d8 011d95b1 0023ca98 00000000 00000007 kernel32!CreateFileW
0:000> du 0023ca98
0023ca98 "d:\temp\a.pdf"
0:000> gu
0:000> r eax
eax=000000f0
0:000> *** Note that this is the wrong process, it's the father
0:000> *** We should not set a breakpoint with a condition of 0xF0 as the handle
0:000> *** Let's wait for the child process
0:000> bd 0
0:000> sxe cpr
0:000> g
[...]
ModLoad: 011c0000 013e5000 AcroRd32.exe
[...]
1:009> bl
1:009> |0s
[...]
0:000> bl
0 d Enable Clear 771a167f 0001 (0001) 0:**** kernel32!CreateFileW
0:000> |1s
[...]
1:009> bl
1:009> *** Did you note? Breakpoints are process specific
1:009> bp kernel32!CreateFileW
Bp expression 'kernel32!CreateFileW' could not be resolved, adding deferred bp
1:009> g
[...]
ntdll!LdrpDoDebuggerBreak+0x2c:
77850ed4 cc int 3
1:009> bl
1 e Disable Clear 771a167f 0001 (0001) 1:**** kernel32!CreateFileW
[...]
Breakpoint 1 hit
[...]
1:009> kb L1
# ChildEBP RetAddr Args to Child
00 002cedcc 771a775d 002cedec 002cede8 772e124c kernel32!CreateFileW
1:009> du 002cedec
002cedec "C:\Windows\Globalization\Sorting"
002cee2c "\sortdefault.nls"
1:009> *** wrong file
1:009> g
[...]
Breakpoint 0 hit
[...]
1:009> kb L1
# ChildEBP RetAddr Args to Child
00 0043da18 5f9b5cf0 06a12e68 80000000 00000001 kernel32!CreateFileW
1:009> du 06a12e68
06a12e68 "d:\temp\a.pdf"
1:009> gu
[...]
1:009> r eax
eax=000001cc
1:009> bp kernel32!readfile
1:009> bl
0 e Disable Clear 771a167f 0001 (0001) 1:**** kernel32!CreateFileW
1 e Disable Clear 771a3ef1 0001 (0001) 1:**** kernel32!ReadFile
1:009> bd 0
1:009> g
Breakpoint 1 hit
[...]
1:009> kb L1
# ChildEBP RetAddr Args to Child
00 0043da44 5f9b74be 000001cc 0043db64 00000008 kernel32!ReadFile
我正在使用 WinDbg 分析 AcroRd32.exe
。 AcroRd32.exe
有2个进程,一个(father-p)启动另一个(child-p)。我使用 .childdbg 1
和 |1s
等命令来调试这两个进程。
我切换到 child-p,然后切换回 father-p,使用条件断点监控 kernel32.dll 的 CreateFileW
和 ReadFile
API。打开 a.pdf
时,只有 CreateFileW
以参数 "C:\a.pdf" 调用。我记得 CreateFileW
的 return 值,文件句柄,使用条件断点来监视 ReadFile
的参数,但是没有调用 ReadFile
与 return CreateFileW
的值。然后随着许多g
命令,令人困惑的事情来了,a.pdf
打开了!
我很困惑。没有调用 ReadFile
,PDF 就打开了。 Acrobat Reader 是怎么做到的?我有两个假设,第一个,它使用一些类似 CreateFileMapping
的 API;另一个(大部分),child-p 成功了。
我们来讨论第二个假设。我在调试father-p的时候,child-p并没有挂起。它是如何打开(读取)文件的?
使用 Rohitab API Monitor 我看到第二个实例使用文件句柄调用 CreateFileW()
和 ReadFile()
:
既然如此,那想必WinDbg中的断点也是一样的吧。如果没有重现问题的确切步骤,我们将无法回答问题所在,例如在你的断点条件下。
当我查看我的演练时,我认为以下可能会出错:
- 您在子进程的条件中使用了父进程的文件句柄,尽管子进程获得了新句柄
- 您在错误的进程上设置了断点。断点是特定于进程的。
- 断点条件中还有其他错误。检查
.if
或j
命令。
这是我的演练,其中显示已命中断点。我在这里没有使用条件断点。
0:000> bp kernel32!CreateFileW
0:000> .childdbg 1
Processes created by the current process will be debugged
0:000> g
[...]
Breakpoint 0 hit
[...]
0:000> kb L1
# ChildEBP RetAddr Args to Child
00 0045f0d8 011d95b1 0023ca98 00000000 00000007 kernel32!CreateFileW
0:000> du 0023ca98
0023ca98 "d:\temp\a.pdf"
0:000> gu
0:000> r eax
eax=000000f0
0:000> *** Note that this is the wrong process, it's the father
0:000> *** We should not set a breakpoint with a condition of 0xF0 as the handle
0:000> *** Let's wait for the child process
0:000> bd 0
0:000> sxe cpr
0:000> g
[...]
ModLoad: 011c0000 013e5000 AcroRd32.exe
[...]
1:009> bl
1:009> |0s
[...]
0:000> bl
0 d Enable Clear 771a167f 0001 (0001) 0:**** kernel32!CreateFileW
0:000> |1s
[...]
1:009> bl
1:009> *** Did you note? Breakpoints are process specific
1:009> bp kernel32!CreateFileW
Bp expression 'kernel32!CreateFileW' could not be resolved, adding deferred bp
1:009> g
[...]
ntdll!LdrpDoDebuggerBreak+0x2c:
77850ed4 cc int 3
1:009> bl
1 e Disable Clear 771a167f 0001 (0001) 1:**** kernel32!CreateFileW
[...]
Breakpoint 1 hit
[...]
1:009> kb L1
# ChildEBP RetAddr Args to Child
00 002cedcc 771a775d 002cedec 002cede8 772e124c kernel32!CreateFileW
1:009> du 002cedec
002cedec "C:\Windows\Globalization\Sorting"
002cee2c "\sortdefault.nls"
1:009> *** wrong file
1:009> g
[...]
Breakpoint 0 hit
[...]
1:009> kb L1
# ChildEBP RetAddr Args to Child
00 0043da18 5f9b5cf0 06a12e68 80000000 00000001 kernel32!CreateFileW
1:009> du 06a12e68
06a12e68 "d:\temp\a.pdf"
1:009> gu
[...]
1:009> r eax
eax=000001cc
1:009> bp kernel32!readfile
1:009> bl
0 e Disable Clear 771a167f 0001 (0001) 1:**** kernel32!CreateFileW
1 e Disable Clear 771a3ef1 0001 (0001) 1:**** kernel32!ReadFile
1:009> bd 0
1:009> g
Breakpoint 1 hit
[...]
1:009> kb L1
# ChildEBP RetAddr Args to Child
00 0043da44 5f9b74be 000001cc 0043db64 00000008 kernel32!ReadFile