C 有没有办法显示WinDBG中可执行文件调用的所有函数(不仅仅是调用堆栈)?
我正在尝试使用WinDbg调试一个不能正常工作的可执行文件(没有收到分段错误,它只是不做他应该做的事情)。我希望看到一个调用堆栈,其中包含运行可执行文件时调用的所有函数。这在WinDbg或任何其他调试器中都是可能的吗?是,正如我评论的那样,使用wt(监视和跟踪)C 有没有办法显示WinDBG中可执行文件调用的所有函数(不仅仅是调用堆栈)?,c,windows,windbg,C,Windows,Windbg,我正在尝试使用WinDbg调试一个不能正常工作的可执行文件(没有收到分段错误,它只是不做他应该做的事情)。我希望看到一个调用堆栈,其中包含运行可执行文件时调用的所有函数。这在WinDbg或任何其他调试器中都是可能的吗?是,正如我评论的那样,使用wt(监视和跟踪) 它可以通过多种方式进行配置 只喜欢一级通话 仅限N级呼叫 仅在特定模块中 仅在主模块等中 下面是ntdll中跨越um km边界的函数的简单跟踪 0:000> u . l1 ntdll!LdrpInitializeProcess+0
它可以通过多种方式进行配置
只喜欢一级通话
仅限N级呼叫
仅在特定模块中
仅在主模块等中 下面是ntdll中跨越um km边界的函数的简单跟踪
0:000> u . l1
ntdll!LdrpInitializeProcess+0x11bf:
76ff6113 e870fffdff call ntdll!NtQueryInformationProcess (76fd6088)
0:000> bp .+5 //set a bp on return address
0:000> bl
0 e 76ff6118 0001 (0001) 0:**** ntdll!LdrpInitializeProcess+0x11c4
0:000> wt
2 0 [ 0] ntdll!NtQueryInformationProcess
27 0 [ 0] aswhook
1 0 [ 1] aswhook
28 1 [ 0] aswhook
1 0 [ 1] 0x6efc0480
1 0 [ 1] 0x6efc0485
2 0 [ 1] ntdll!NtQueryInformationProcess
2 0 [ 2] ntdll!KiFastSystemCall
1 0 [ 1] ntdll!NtQueryInformationProcess
46 8 [ 0] aswhook
3 0 [ 1] aswhook
Breakpoint 0 hit
eax=00000000 ebx=7ffdf000 ecx=e8cb8789 edx=ffffffff esi=ffffffff edi=00000000
eip=76ff6118 esp=0018f59c ebp=0018f6f4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!LdrpInitializeProcess+0x11c4:
76ff6118 85c0 test eax,eax
0:000>
是,正如我所评论的,使用wt(监视和跟踪)它可以通过多种方式进行配置
只喜欢一级通话
仅限N级呼叫
仅在特定模块中
仅在主模块等中 下面是ntdll中跨越um km边界的函数的简单跟踪
0:000> u . l1
ntdll!LdrpInitializeProcess+0x11bf:
76ff6113 e870fffdff call ntdll!NtQueryInformationProcess (76fd6088)
0:000> bp .+5 //set a bp on return address
0:000> bl
0 e 76ff6118 0001 (0001) 0:**** ntdll!LdrpInitializeProcess+0x11c4
0:000> wt
2 0 [ 0] ntdll!NtQueryInformationProcess
27 0 [ 0] aswhook
1 0 [ 1] aswhook
28 1 [ 0] aswhook
1 0 [ 1] 0x6efc0480
1 0 [ 1] 0x6efc0485
2 0 [ 1] ntdll!NtQueryInformationProcess
2 0 [ 2] ntdll!KiFastSystemCall
1 0 [ 1] ntdll!NtQueryInformationProcess
46 8 [ 0] aswhook
3 0 [ 1] aswhook
Breakpoint 0 hit
eax=00000000 ebx=7ffdf000 ecx=e8cb8789 edx=ffffffff esi=ffffffff edi=00000000
eip=76ff6118 esp=0018f59c ebp=0018f6f4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!LdrpInitializeProcess+0x11c4:
76ff6118 85c0 test eax,eax
0:000>
调用的所有函数是什么?程序执行的所有函数您可以查看
wt
以开始跟踪您的调用。请注意,只有在可以解析符号时才能得到函数名,否则只能得到地址。您可以查看tc
来转储特定数量的呼叫。这不是一个完全无用的运动。我过去曾使用它在返回地址上设置断点,并使用wt或watch and trace。它可以为您提供非常详细的调用流摘要即使RbMm最终可能是正确的,我想每个开发人员都希望这样做——我认为这是合法的。如利文所说,使用wt。但是-也许可以帮你自己一个忙,先用calc.exe这样的简单应用程序试试。如果从初始断点开始执行此操作,您会注意到启动需要约20分钟,而不是毫秒。调用的所有函数是什么?程序执行的所有函数您可以查看wt
以开始跟踪调用。请注意,只有在可以解析符号时才能得到函数名,否则只能得到地址。您可以查看tc
来转储特定数量的呼叫。这不是一个完全无用的运动。我过去曾使用它在返回地址上设置断点,并使用wt或watch and trace。它可以为您提供非常详细的调用流摘要即使RbMm最终可能是正确的,我想每个开发人员都希望这样做——我认为这是合法的。如利文所说,使用wt。但是-也许可以帮你自己一个忙,先用calc.exe这样的简单应用程序试试。如果从初始断点开始执行此操作,您会注意到启动需要约20分钟,而不是毫秒