簡體   English   中英

優化堆棧行走性能

[英]Optimizing Stack-Walking performance

目前我使用dbghelp庫來遍歷某個進程'線程的堆棧(使用GetThreadContext()StackWalk64() )並僅收集每個幀包含的返回地址。

但是,這樣做的開銷對於系統需求來說太大了 - 總體時間是apx。 每個堆棧步行5毫秒(10-15幀)。 這次包括GetThreadContext()和調用StackWalk64()以獲取所有幀的循環。

無論如何,我必須找到一種方法來更快地完成它。 任何人都知道我該怎么做?


編輯:

有誰知道ETW(Windows事件跟蹤)機制?

如果是這樣,我如何跟蹤在特定時間段內發生的所有上下文切換? 是否有事件提供程序在每個上下文切換上發布事件?

我能想到的最快的方法是通過創建一個內核驅動程序來創建自己的GetThreadContextStackWalk64版本,該驅動程序抓取您嘗試監視的線程的ETHREAD結構的kernelStack字段。 是一篇關於這個主題的好文章。

如果您使用的是Windows Vista或更高版本,則應使用ETW,period。 您可以激活所有您正在談論的內容,包括上下文切換和示例配置文件事件,它非常有效。 對於X86,它基本上是走EBP寄存器鏈,這是一個需要迭代的地址鏈表。 在64位的情況下,堆棧步行器必須展開堆棧,因此效率稍低,但我可以告訴你,如果你在應用程序中做了任何合理的工作量,堆棧行走的效果將不會顯示起來。 它肯定不在毫秒范圍內。

ETW部分實際上是一個獨立的問題。 Windows性能分析工具可以捕獲所有上下文切換,以及“資源爭用並發性分析”模式下的Visual Studio Profiler 您也可以使用logman手動將所有事件轉儲到文件中,請參閱此處的說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM