青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

focus on linux, c/c++, lua

Walking the callstack [譯文 part2]

遍歷當前線程的callstack

x86的系統上(XP之前),是沒有一個直接的API用來獲得當前線程的上下文的。當時提倡的做法是在捕獲系統異常中來獲得。現在在我們的代碼中,我們實現了有效的獲取上下文的方法。默認的情況下,我們是通過內聯匯編代碼來獲取EIP,ESPEBP的值。如果你想使用我剛才提到的捕獲異常的方法來實現的話,那你就需要定義一個CURRENT_THREAD_VIA_EXCEPTION這樣的宏。但是我們應該意識到,其實GET_CURRENT_CONTEXT也是一個宏,內部也是使用了捕捉異常的原理。我們的函數都必須要能包含這些宏的聲明。

XP開始以及在x64IA64平臺上,目前已經有API來獲得當前線程的上下文,就是RtlCaptureContext.

演示代碼7

StackWalker sw;

sw.ShowCallstack();

在同一個進程內遍歷其他線程的callstack(略)

遍歷另一個進程內的某線程callstack(略)

(譯者注:由于時間原因,上述兩部分的翻譯暫時省略了,內容也比較簡單,只是調用了StackWalker的不同構造函數)

重用StackWalk的實例

重用StackWalk的實例是沒有任何問題的,只要你想在同一個進程內遍歷callstack。如果你重復多次用到callstack的遍歷,我強烈你推薦重用一個實例。原因很簡單:當你創建一個新的實例的時候,symbol文件就要被重新加載一次,這個是非常耗時的。而且多個StackWalk跨線程工作也是不可靠的,因為dbghelp.dll不是線程安全的。綜上,在一個進程中保持只有一個StackWalker實例是最合理的做法。

Symbol的搜索路徑

通常情況下,Symbol的搜索路徑(SymBuildPath SymUseSymSrv)主要是用來搜索這個文件dbghelp.dll。這個路徑通常包含一下目錄:

1, szSymPath是否提供是可選擇的,如果提供的話,那么SymBuildPath會自動生成。在szSymPath中每個路徑之間要用分號“;”來分開。

2, 當前工作目錄

3, 可執行文件的目錄,如exel

4, _NT_SYMBOL_PATH的環境變量

5, _NT_ALTERNATE_SYMBOL_PATH的環境變量

6, SYSTEMROOT的環境變量

7, SYSTEMROOT\system32的環境變量

8, MS符號服務器SRV*%SYSTEMDRIVE%\websymbols*http://msdl.microsoft.com/download/symbols

符號服務器

如果你想使用MS的公共信號服務器,你可以選擇安裝windbg(這樣symsrv.dll和最新dbghelp.dll會被自動查詢到),你也可以選擇從網絡傳輸中獲取這些最新符號,不過推薦前者,這樣就不會因為網絡故障而出現加載符號失敗。

加載程式和符號

為了能成功遍歷線程的callstackdbghelp.dll要獲得所有被加載模塊的信息。所有你需要通過SymLoadModule64這個API來注冊所有被加載的模塊,在注冊之前,第一步是枚舉出所有的模塊。

win9x之后。利用ToolHelp32_API可以實現這個需求,需要用的API有,CreateToolhelp32SnapShotModule32FirstModule32Next。通常情況下這些API包含在kernel32.dll,但是在win9x的系統上,這些API包含在tlhelp32.dll中,所以在代碼中要做分支判斷。

如果你是在NT4上干活的話,那么使用ToolHelp32-API只是一個夢想。但是你可以使用PSAPI來取而代之。你需要使用到一下APIEnumProcessModules, GetModuleInformation, GetModuleBaseName, GetModuleFileNameEx


遍歷當前線程的
callstack

x86的系統上(XP之前),是沒有一個直接的API用來獲得當前線程的上下文的。當時提倡的做法是在捕獲系統異常中來獲得。現在在我們的代碼中,我們實現了有效的獲取上下文的方法。默認的情況下,我們是通過內聯匯編代碼來獲取EIP,ESPEBP的值。如果你想使用我剛才提到的捕獲異常的方法來實現的話,那你就需要定義一個CURRENT_THREAD_VIA_EXCEPTION這樣的宏。但是我們應該意識到,其實GET_CURRENT_CONTEXT也是一個宏,內部也是使用了捕捉異常的原理。我們的函數都必須要能包含這些宏的聲明。

XP開始以及在x64IA64平臺上,目前已經有API來獲得當前線程的上下文,就是RtlCaptureContext.

演示代碼7

StackWalker sw;

sw.ShowCallstack();

在同一個進程內遍歷其他線程的callstack(略)

遍歷另一個進程內的某線程callstack(略)

(譯者注:由于時間原因,上述兩部分的翻譯暫時省略了,內容也比較簡單,只是調用了StackWalker的不同構造函數)

重用StackWalk的實例

重用StackWalk的實例是沒有任何問題的,只要你想在同一個進程內遍歷callstack。如果你重復多次用到callstack的遍歷,我強烈你推薦重用一個實例。原因很簡單:當你創建一個新的實例的時候,symbol文件就要被重新加載一次,這個是非常耗時的。而且多個StackWalk跨線程工作也是不可靠的,因為dbghelp.dll不是線程安全的。綜上,在一個進程中保持只有一個StackWalker實例是最合理的做法。

Symbol的搜索路徑

通常情況下,Symbol的搜索路徑(SymBuildPath SymUseSymSrv)主要是用來搜索這個文件dbghelp.dll。這個路徑通常包含一下目錄:

1, szSymPath是否提供是可選擇的,如果提供的話,那么SymBuildPath會自動生成。在szSymPath中每個路徑之間要用分號“;”來分開。

2, 當前工作目錄

3, 可執行文件的目錄,如exel

4, _NT_SYMBOL_PATH的環境變量

5, _NT_ALTERNATE_SYMBOL_PATH的環境變量

6, SYSTEMROOT的環境變量

7, SYSTEMROOT\system32的環境變量

8, MS符號服務器SRV*%SYSTEMDRIVE%\websymbols*http://msdl.microsoft.com/download/symbols

符號服務器

如果你想使用MS的公共信號服務器,你可以選擇安裝windbg(這樣symsrv.dll和最新dbghelp.dll會被自動查詢到),你也可以選擇從網絡傳輸中獲取這些最新符號,不過推薦前者,這樣就不會因為網絡故障而出現加載符號失敗。

加載程式和符號

為了能成功遍歷線程的callstackdbghelp.dll要獲得所有被加載模塊的信息。所有你需要通過SymLoadModule64這個API來注冊所有被加載的模塊,在注冊之前,第一步是枚舉出所有的模塊。

win9x之后。利用ToolHelp32_API可以實現這個需求,需要用的API有,CreateToolhelp32SnapShotModule32FirstModule32Next。通常情況下這些API包含在kernel32.dll,但是在win9x的系統上,這些API包含在tlhelp32.dll中,所以在代碼中要做分支判斷。

如果你是在NT4上干活的話,那么使用ToolHelp32-API只是一個夢想。但是你可以使用PSAPI來取而代之。你需要使用到一下APIEnumProcessModules, GetModuleInformation, GetModuleBaseName, GetModuleFileNameEx


Dbghelp.dll

下面就來隨便啰嗦幾句dbghelp.dll

1, 首先,在MS,有兩個team在負責開發dbghelp.dll,一個是os-team,另一個是debug-team。通常情況下,你會以為windbg提供的dbghelp.dll是最新的版本。但是有個問題就是這兩個小組發布的dbghelp.dll的版本是不同的。舉個例子來說:xp-sp1dbghelp.dll版本是5.1.2600.11062002-08-29)。但是debug-team發布的6.0.0017.0版本時間卻是2002-04-31。(譯者注:寒,MS也會犯這種錯誤)。這樣版本的發布就會有沖突,所以很難通過版本好來確定哪個更好,更有效。

2, Winme/W2k開始,system32目錄下面的dbghelp.dll文件是受保護的。所以如果你想成功遍歷callstack,,最好去下載個最新版本的dbghelp.dll放在你的exe目錄下面。否則在W2k上會導致一個問題,就是,如果你想遍歷一個用VC7+編譯的工程就會出錯。因為VC7+的編譯器生成的PDB格式文件不能被dbghelp.dll識別,這樣你就不會得到有效的callstack信息。總之,保險起見,不要使用 OSdbghelp.dll,去下載最新的dbghelp.dll來使用。(譯者注:我在論壇中看到很多人無法正確遍歷棧,都是dbghelp.dll的版本較老造成的。)

3, V6.5.3.7版本的dbghelp.dll有個bug,或是說StackWalk64函數的文檔發生了變化。文檔中描述:

如果STACKFRAME64的兩個成員AddrPCAddrFrame沒有被初始化就作為參數傳給StackWalk64的話,那么這個函數在第一次被調用的時候就會失敗。而且,只有當參數MachineType不是IAMGE_FILE_MACHINE_I386的時候,參數ContectRecord才要求被初始化。

但是這個是錯誤的。在x86上,當你給ContextRecordNULL的時候,并不能獲得到callstack。以我的觀點,這是比較大的文檔改動。現在你既可以通過初始話AddrStack,也可以通過包含EIP,EBP,ESPContextRecord來成功獲取callstack

Stackwalker的操作開關

你可以按照自己的需求來定義操作開關

演示代碼7

typedef enum StackWalkOptions

{

    // No addition info will be retrived

    // (only the address is available)

    RetrieveNone = 0,

    // Try to get the symbol-name

    RetrieveSymbol = 1,

    // Try to get the line for this symbol

    RetrieveLine = 2,

    // Try to retrieve the module-infos

    RetrieveModuleInfo = 4,

    // Also retrieve the version for the DLL/EXE

    RetrieveFileVersion = 8,

    // Contains all the abouve

    RetrieveVerbose = 0xF,

    // Generate a "good" symbol-search-path

    SymBuildPath = 0x10,

    // Also use the public Microsoft-Symbol-Server

    SymUseSymSrv = 0x20,

    // Contains all the abouve "Sym"-options

    SymAll = 0x30,

    // Contains all options (default)

    OptionsAll = 0x3F

} StackWalkOptions;

 

使用須知

1, NT/Win9x:這個工程只支持StackWalk64這個API。如果你想在NT4/win9x上使用的話,你需要重新配置dbghelp.dll

2, 當前工程在遍歷過程中只支持ANSI名稱符,(譯者注:C++中沒看到過有人用中文命名的函數名,但java大有人在),當然,如果你也可以選擇以unicode的編碼方式來編譯工程來解決中文函數名的問題。

3, NT4/win9x的平臺上,用“OpenThread”來打開遠程線程是不支持的,如果你想實現,請參考Remote Library

4, 遍歷混合模式的callstack(包含managedunmanaged)并不會返回unmanaged的函數。

posted on 2010-10-20 10:22 zuhd 閱讀(619) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲已满18点击进入久久| 日韩视频亚洲视频| 久久综合久久综合久久| 亚洲欧美日韩综合| 欧美制服丝袜第一页| 欧美自拍偷拍午夜视频| 久久国产精品久久w女人spa| 亚洲欧美日韩专区| 久久久噜噜噜久久久| 欧美h视频在线| 欧美性理论片在线观看片免费| 欧美日韩一区二区三区在线看 | 欧美激情国产高清| 亚洲看片一区| 欧美一区二区三区四区在线观看地址 | 日韩写真在线| 亚洲欧美日韩专区| 久久久伊人欧美| 欧美日韩亚洲系列| 国产欧美一区二区精品婷婷| 亚洲第一福利社区| 亚洲免费视频观看| 免费视频最近日韩| 亚洲视频图片小说| 美女脱光内衣内裤视频久久影院| 欧美日韩亚洲在线| 在线观看欧美日本| 亚洲欧美综合另类中字| 欧美国产第一页| 亚洲欧美日韩高清| 欧美日韩免费看| 亚洲高清免费在线| 久久国产精品久久久久久电车| 亚洲国产高清aⅴ视频| 午夜久久久久久| 欧美三级精品| 亚洲免费av网站| 欧美1区视频| 欧美专区18| 亚洲激情另类| 国产一区激情| 亚洲综合色自拍一区| 欧美国产在线观看| 久久高清福利视频| 国产精品人人爽人人做我的可爱| 日韩亚洲欧美成人| 欧美成人在线网站| 久久久www| 国产在线高清精品| 久久大逼视频| 亚洲一级在线观看| 国产精品国产三级欧美二区 | 久久久噜噜噜久久人人看| 国产精品久久久久一区二区三区共 | 在线免费观看一区二区三区| 亚洲欧美日本国产专区一区| 最新亚洲电影| 欧美大片免费久久精品三p| 在线观看日韩av电影| 美女日韩欧美| 免费视频亚洲| 亚洲精品看片| 亚洲伦理中文字幕| 国产精品s色| 午夜激情一区| 亚洲女同性videos| 国产午夜亚洲精品不卡| 久久国产毛片| 久久人人97超碰国产公开结果| 黄色成人精品网站| 欧美成人在线免费观看| 欧美国产一区视频在线观看| av成人免费观看| 99精品欧美一区二区蜜桃免费| 欧美日韩精品系列| 亚洲欧美三级在线| 久久国产视频网| 亚洲日本一区二区| 夜夜爽www精品| 国产日韩高清一区二区三区在线| 久久日韩精品| 欧美精品日韩三级| 久久精品72免费观看| 蜜桃久久精品乱码一区二区| 99伊人成综合| 午夜国产一区| 亚洲日韩欧美视频一区| 在线亚洲自拍| 亚洲国产91色在线| 亚洲视频1区| 亚洲第一页在线| 中文av字幕一区| 久久免费视频在线| 一本色道久久加勒比88综合| 国产精品亚洲综合| 欧美高清自拍一区| 国产精品视频免费| 欧美国产精品久久| 国产欧美精品在线播放| 亚洲第一综合天堂另类专| 国产精品豆花视频| 亚洲国产精品va在线看黑人| 国产精品久久久一区麻豆最新章节 | 在线看日韩av| 一区二区国产日产| 亚洲国产欧美一区二区三区久久| 亚洲深夜福利在线| 日韩性生活视频| 久久久国产精品一区| 亚洲欧美欧美一区二区三区| 欧美aⅴ99久久黑人专区| 久久成人羞羞网站| 欧美亚男人的天堂| 亚洲欧洲日韩在线| 亚洲国产日日夜夜| 久久激情五月婷婷| 欧美在线观看一二区| 欧美视频不卡中文| 亚洲精品乱码久久久久| 亚洲国产精品传媒在线观看| 久久精品91久久久久久再现| 欧美在线啊v一区| 国产精品亚洲综合久久| 亚洲视频在线观看视频| 亚洲午夜av| 欧美日韩一区二区三区| 亚洲裸体视频| 在线亚洲电影| 国产精品久久久久久久7电影| 亚洲精品中文字幕有码专区| 亚洲狼人综合| 欧美精品一区二区三区四区| 欧美激情精品久久久久久免费印度| 国户精品久久久久久久久久久不卡 | 一区二区三区精品久久久| 亚洲伦理久久| 欧美日本精品| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美国产日韩a欧美在线观看| 精品成人在线观看| 久久躁日日躁aaaaxxxx| 欧美第一黄网免费网站| 亚洲国产精品成人| 欧美激情亚洲另类| 久久五月激情| 欧美岛国激情| 亚洲欧洲视频| 欧美日韩精品一本二本三本| 夜夜嗨av一区二区三区四区| 亚洲——在线| 国产亚洲精品一区二555| 久久精品国产精品亚洲| 欧美成人一区二区三区在线观看| 亚洲国产综合91精品麻豆| 欧美日本国产精品| 亚洲欧洲av一区二区| 久久这里只有精品视频首页| 在线不卡中文字幕播放| 欧美精品激情在线| 亚洲在线一区| 欧美成在线观看| 亚洲一区二区伦理| 国产综合香蕉五月婷在线| 欧美成人午夜激情视频| 这里只有视频精品| 久久综合亚洲社区| 在线一区观看| 伊人色综合久久天天| 欧美视频免费| 乱码第一页成人| 亚洲尤物在线视频观看| 欧美福利小视频| 欧美一区二区三区四区在线观看| 伊人久久婷婷色综合98网| 欧美三级日本三级少妇99| 久久精品一区二区三区四区 | 久久嫩草精品久久久精品| 亚洲高清免费视频| 久久精品国产成人| 中文一区字幕| 亚洲高清在线| 国产欧美一区二区精品忘忧草 | 蜜桃av综合| 性xx色xx综合久久久xx| 亚洲乱码精品一二三四区日韩在线| 国产精品稀缺呦系列在线| 欧美激情综合五月色丁香小说| 欧美一区二区三区免费观看 | 欧美mv日韩mv国产网站app| 亚洲欧美日韩在线高清直播| 亚洲精品国产精品国自产观看浪潮| 久久久精品动漫| 亚洲欧美成人精品| 一个人看的www久久| 影音先锋日韩精品| 国产一区二区日韩精品欧美精品| 欧美三日本三级三级在线播放| 麻豆精品国产91久久久久久| 性欧美videos另类喷潮| 亚洲午夜高清视频|