Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是RtlPcToFileHeader?_C++_Windows_Visual Studio 2005_Profiling - Fatal编程技术网

C++ 什么是RtlPcToFileHeader?

C++ 什么是RtlPcToFileHeader?,c++,windows,visual-studio-2005,profiling,C++,Windows,Visual Studio 2005,Profiling,我正在使用VerySleepy 0.7评测一个应用程序。该应用程序是用C++编写的,用VS 4.6编写,用VS 2005编译,运行在Windows 7的X64上。 到目前为止,使用率最高的是调用 从文档中我不清楚什么是RtlPcToFileHeader,但因为它是在“错误处理函数”下引用的,所以它似乎是不应该存在的。这就是说,因为它基本上贯穿于我的评测捕获过程,所以它也可能是一些非常基本的函数调用(例如,main)或评测本身的副作用 RtlPcToFileHeader函数的用途是什么 更新:根据

我正在使用VerySleepy 0.7评测一个应用程序。该应用程序是用C++编写的,用VS 4.6编写,用VS 2005编译,运行在Windows 7的X64上。 到目前为止,使用率最高的是调用

从文档中我不清楚什么是RtlPcToFileHeader,但因为它是在“错误处理函数”下引用的,所以它似乎是不应该存在的。这就是说,因为它基本上贯穿于我的评测捕获过程,所以它也可能是一些非常基本的函数调用(例如,
main
)或评测本身的副作用

RtlPcToFileHeader函数的用途是什么


更新:根据Mike的建议,我确实闯入了正在运行的进程,有几次它在堆栈跟踪中包含RtlPcToFileHeader,它似乎以某种方式绑定到了
动态\u cast
。我还改为提问,以更好地反映我正在尝试确定RtlPcToFileHeader的实际功能。

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

如果这对你来说技术含量太低,那就试试,或者其他任何报告行级别百分比的墙时间堆栈采样器,最好使用蝴蝶查看器


下面的MSDN帖子暗示微软在动态转换期间调用的RTTI例程的x64实现比x86慢

64位系统上的这些RTTI指针似乎只是模块基址的偏移量。要解除对它们的引用,需要模块基址——由API函数::RtlPcToFileHeader()检索

如果这是正确的,那么除了重构代码以最小化动态类型转换的使用并更多地依赖虚拟方法之外,您似乎什么都做不了。或者这仅仅是探查器的一个缺陷——它在动态\u强制转换中丢失了?

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

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

为了进行搜索,它将遍历映射到当前进程的所有模块的映射地址,并使用内存中的进程“
PEB/TEB
结构。在此之前,它会获取一个共享RW锁(类似于调用),然后在搜索完成后释放它。

谢谢,Mike。我已经尝试了你所指出的,并且更新了我的问题,以更好地反映我所寻找的。@Jesse:我刚刚还回顾了《非常困倦》的源代码,它似乎也可以做或可以做壁时堆栈采样,并且它能够显示单个堆栈采样。在任何情况下,如果它花时间进行动态_cast,那么显而易见的下一个问题是,它的目的是什么?这可能是你的第一个“瓶颈”。@Jesse:根据在线文档,该例程获取一个指令地址,并试图找出它所在的图像(可执行pgm的一部分)。人们只能猜测为什么它被称为铸造的一部分,也许是异常处理的一部分。如果您可以读取,堆栈应该会告诉您原因,但在任何情况下,代码中的某些内容会触发它,所以这就是我们要查看的内容。对于::RtlPcToFileHeader()对x64上的动态强制转换性能的影响是否有任何最终结论?我很想知道。@Nikola:我想我们还没有弄清楚调用它的确切时间和原因。我想不管是什么,这都是必要的。据杰西说,它使用了1/6的非IO时间。在我看来,他比他可能需要的更频繁地执行这些动态投射。
HMODULE hModule = NULL;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
   GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
   pArbitraryAddr,
   &hModule);