【问题标题】:Limited stack trace in Process ExplorerProcess Explorer 中的有限堆栈跟踪
【发布时间】:2010-02-10 10:47:24
【问题描述】:

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

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

【问题讨论】:

    标签: windows stack-trace process-explorer


    【解决方案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 存在限制。我认为问题在于,由于我上面列出的原因之一,遍历该线程的调用堆栈是有问题的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2011-05-25
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多