2010-02-10 75 views
0

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

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

回答

1

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

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

  • 不同的调用约定会将数据放在堆栈的不同位置,导致难以走栈。我可以想到4种定义,3种常用,另外一种是奇特的:cdecl,fastcall,stdcall,naked。

  • 对于发布版本,代码优化器可以使用被称为帧指针省略(FPO)的技术来取消帧指针。如果没有FPO(有时甚至是PDB文件中的FPO数据),则无法成功地执行调用堆栈。钩子 - 任何助手DLL,防病毒,调试钩子,检测代码,恶意软件等等,都可能在某个点上弄乱了调用堆栈,因为他们已经在调用堆栈中插入了自己的存根代码,并且该小块可能不会步行者可以步行。

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

由于各种呼叫在32位的Windows(微软和其他厂商)约定的,很难制定出当你从一个框移动到另一个会发生什么。

对于64位系统,有一个指定的调用约定。这使生活变得更容易。也就是说,你仍然存在帮助程序DLL和钩子在堆栈中执行自己的事情的问题,并且在堆栈中可能仍然会导致问题。

我怀疑Process Explorer中存在限制。我认为这个问题只是因为我上面列出的原因之一,为该线程漫游是困难的。