Windows Process Explorer中的有限堆栈跟踪

Windows Process Explorer中的有限堆栈跟踪,windows,stack-trace,process-explorer,Windows,Stack Trace,Process Explorer,我有一个进程在WindowsServer2003SP2下运行。当我想检查其中一个线程的堆栈跟踪时,它总是被限制为9个条目。这些条目被正确地解析(我已经准备好了PDB),但列表只是被剪切在中间 您知道Process Explorer中有任何限制吗?我假设您认为此线程的完整堆栈跟踪应该有9个以上的条目。您没有提到是32位操作系统还是64位操作系统,但我将假设是32位操作系统,然后再考虑64位操作系统 有时,在32位系统上收集堆栈跟踪时,您无法收集堆栈跟踪的任何项,或者您只能收集有限数量的堆栈帧信息,

我有一个进程在WindowsServer2003SP2下运行。当我想检查其中一个线程的堆栈跟踪时,它总是被限制为9个条目。这些条目被正确地解析(我已经准备好了PDB),但列表只是被剪切在中间


您知道Process Explorer中有任何限制吗?

我假设您认为此线程的完整堆栈跟踪应该有9个以上的条目。您没有提到是32位操作系统还是64位操作系统,但我将假设是32位操作系统,然后再考虑64位操作系统

有时,在32位系统上收集堆栈跟踪时,您无法收集堆栈跟踪的任何项,或者您只能收集有限数量的堆栈帧信息,即使您知道callstack更深。原因如下:

  • 不同的调用约定将数据放在堆栈的不同位置,这使得在堆栈中行走变得困难。我能想到4个定义,3个常用,一个更奇特的:cdecl、fastcall、stdcall、裸

  • 对于发布版本,代码优化器可以使用一种称为帧指针省略(FPO)的技术删除帧指针。如果没有FPO(有时甚至在PDB文件中有FPO数据),您就无法成功地遍历调用堆栈

  • 钩子-任何帮助程序DLL、反病毒、调试钩子、插入指令的代码、恶意软件等都可能在某个时候破坏调用堆栈,因为它们在调用堆栈上插入了自己的存根代码,而堆栈遍历器可能无法遍历该小部分

  • 字节码虚拟机。根据虚拟机的编写方式,VM可能会在调用堆栈上放置蹦床来帮助其执行。这将使堆栈难以成功行走

由于32位Windows上有各种各样的调用约定(来自Microsoft和其他供应商),当您从一个帧移动到另一个帧时,很难确定预期的结果

对于64位系统,指定了一种调用约定。这让生活变得容易多了。也就是说,您仍然存在帮助器DLL和钩子在堆栈中做自己的事情的问题,这在遍历堆栈时仍然可能会导致问题

我怀疑Process Explorer中是否存在限制。我认为问题在于,遍历该线程的调用堆栈是有问题的,因为我上面列出了一个原因