什么是RtlPcToFileHeader?

问题描述 投票:1回答:3

我正在使用VerySleepy 0.7分析应用程序。该应用程序使用Qt 4.6.x编写,使用VS 2005编译,并在Windows 7 Ultimate x64上运行。

迄今为止使用率最高的是对RtlPcToFileHeader的调用

Exclusive Inclusive %Exclusive %Inclusive Module
33.67s    33.67s    15.13%     15.13%     ntdll

从文档中我不清楚RtlPcToFileHeader是什么,但因为它在“错误处理函数”下被引用,所以它似乎不应该存在。话虽如此,因为它基本上在我的分析捕获中使用,它也可能是一些非常基本的函数调用(即像main)或分析本身的副作用。

RtlPcToFileHeader函数的用途是什么?

更新:根据迈克的建议,我确实打破了运行过程,并且它在堆栈跟踪中包含RtlPcToFileHeader,它似乎与dynamic_cast有关。我也改变了问题,以更好地反映我正在尝试确定RtlPcToFileHeader实际上做了什么。

c++ windows visual-studio-2005 profiling
3个回答
2
投票

只需在调试器下暂停它。研究调用堆栈以了解它正在做什么以及为什么。然后重复几次。这将告诉你时间的去向和原因。

如果这对你来说太低技术,可以尝试LTProf,或任何其他报告行级百分比的壁挂式采样器,最好使用蝴蝶查看器。

你迷惑的数字是precisely the legacy of gprof


2
投票

以下MSDN帖子暗示,在dynamic_cast期间调用的Microsoft的RTTI例程的x64实现比x86实现慢。

http://blogs.msdn.com/b/junfeng/archive/2006/10/17/dynamic-cast-is-slow-in-x64.aspx

64位系统上的这些RTTI指针似乎只是偏离模块的基址。要取消引用它们,您需要模块基址 - 由API函数:: RtlPcToFileHeader()检索。

如果这是正确的,似乎你无法对它做任何事情,除了重构代码以最小化dynamic_casts的使用并更多地依赖虚拟方法。或者它可能只是分析器的不完美 - 它在dynamic_casts中丢失了?


1
投票

RtlPcToFileHeader是一个函数,它使用任意地址(PcValue)来查找映射到当前进程的地址空间的匹配模块的基址。它与调用非常相似:

HMODULE hModule = NULL;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
   GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
   pArbitraryAddr,
   &hModule);

对于它的搜索,它通过映射映射到当前进程的所有模块的映射,为此它使用进程'PEB/TEB结构在内存中。在此之前,它获取共享RW锁(类似于调用AcquireSRWLockShared),然后在搜索完成后释放它。

© www.soinside.com 2019 - 2024. All rights reserved.