代码之家  ›  专栏  ›  技术社区  ›  Michal Sznajder

进程资源管理器中的堆栈跟踪有限

  •  0
  • Michal Sznajder  · 技术社区  · 15 年前

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

    您知道Process Explorer中有什么限制吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Stephen Kellett    14 年前

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

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

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

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

    • 钩子-任何帮助程序DLL、反病毒、调试钩子、插入指令的代码、恶意软件等都可能在某个时间点弄乱调用堆栈,因为它们已经在调用堆栈上插入了自己的存根代码,而这个小部分可能无法被堆栈查询器访问。

    • 字节码虚拟机。根据虚拟机的写入方式,虚拟机可以将蹦床放在调用堆栈上以帮助执行。这将使堆栈难以成功运行。

    由于32位Windows(来自Microsoft和其他供应商)上的调用约定多种多样,因此很难计算出从一个帧移动到另一个帧时的期望值。

    对于64位系统,指定了一个调用约定。这让生活变得容易多了。也就是说,您仍然存在帮助程序DLL和钩子对堆栈执行自己的操作的问题,这可能仍然会导致您在遍历堆栈时出现问题。

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