0

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

你知道 Process Explorer 有什么限制吗?

4

1 回答 1

1

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

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

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

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

  • 挂钩 - 任何帮助 DLL、防病毒、调试挂钩、检测代码、恶意软件等,都可能在某个时候弄乱调用堆栈,因为它们已经在调用堆栈上插入了自己的存根代码,并且该小部分可能无法被堆栈遍历沃克。

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

由于 32 位 Windows 上的各种调用约定(来自 Microsoft 和其他供应商),很难弄清楚当您从一个框架移动到另一个框架时会发生什么。

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

我怀疑 Process Explorer 存在限制。我认为问题只是因为我上面列出的原因之一,走该线程的调用堆栈是有问题的。

于 2010-03-30T17:53:59.330 回答