Process Explorer中的有限堆栈跟踪

时间:2010-02-10 10:47:24

标签: windows stack-trace process-explorer

我在Windows Server 2003 SP2下运行了一个进程。当我想检查其中一个线程的堆栈跟踪时,它总是限制为9个条目。这些条目被正确解析(我有PDB)但列表只是在中间切割。

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

1 个答案:

答案 0 :(得分:1)

我假设你认为这个线程的完整堆栈跟踪应该有超过9个条目。你没有提到32位操作系统或64位操作系统,但我会假设32位操作系统然后覆盖64位作为事后的想法。

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

  • 不同的调用约定将数据放在堆栈的不同位置,这使得堆栈难以走动。我可以想到4个定义,3个常用,1个更具异国情调:cdecl,fastcall,stdcall,naked。

  • 对于发布版本,代码优化器可能会使用称为帧指针省略(FPO)的技术取消帧指针。如果没有FPO(有时甚至是PDB文件中的FPO数据),您也无法成功遍历callstack。

  • Hooks - 任何帮助DLL,反病毒,调试钩子,检测代码,恶意软件等,可能会在某个时候搞乱callstack,因为他们已经在callstack上插入了自己的存根代码,而那个小部分可能会不能靠堆栈助行器走路。

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

由于32位Windows(来自微软和其他供应商)的调用约定多种多样,因此当您从一个帧移动到另一个帧时,很难找到预期的结果。

对于64位系统,指定了一个调用约定。这让生活变得更轻松。也就是说,你仍然有帮助DLL和钩子在堆栈中做自己的事情的问题,这可能仍然会导致你走栈时出现问题。

我怀疑Process Explorer存在限制。我认为这个问题只是因为上面列出的原因之一,因为该线程的callstack走路是有问题的。