亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

調試SQLSERVER (二)使用Windbg調試SQLSERVER的環境設置

2024-07-21 02:48:11
字體:
來源:轉載
供稿:網友
調試SQLSERVER (二)使用Windbg調試SQLSERVER的環境設置調試SQLSERVER (二)使用Windbg調試SQLSERVER的環境設置

調試SQLSERVER (一)生成dump文件的方法調試SQLSERVER (三)使用Windbg調試SQLSERVER的一些命令

大家知道在Windows里面,調試可以分為兩個領域:

1、內核態調試

2、用戶態調試

一般的程序都是運行在用戶態,包括SQLSERVER,SQLServer 會依賴于操作系統的Win32/Win64 API去調用I/O或者其他他需要的服務

用戶態程序調試和內核態程序調試是不太一樣的,即使有些命令是一樣的

還有另外一個要注意的是live debug和dump file

live debug:直接附加調試器到進程--使進程hang住,使被調試程序不能繼續執行代碼

dump file :通常是一個dump文件,dump文件是進程生成的當時這個進程的所有或部分內存內容,并且可以被調試器讀取

full dump文件 通常的擴展名是.dmp ,文件里面一般不包含已經paged out 的內存內容

mini dump文件 通常的擴展名是.mdmp ,一般只包含線程棧和加載的模塊名

Windbg: 是一個GUI調試器工具并且可以調試內核態和用戶態程序,除了Windbg調試器 當然還有其他調試器 ,例如kd, cdb, ntsd


簡單復習

應用程序以進程運行,這里我們關注的進程是sqlservr.exe ,在用戶態調試下,我們會調試一個單獨的進程,無論是使用live debug(附加進程方式)還是讀取一個dump文件

在調試的時候都能看到進程的內存空間。在內核態調試里,我們可以看到所有進程和他們的內存空間(注意:在dump文件里面我們訪問不到當生成dump文件的時候

已經被paged out 的那部分內存地址)

stack trace:單個線程里面執行的代碼的棧,一個線程可以有用戶態棧內核態棧,在用戶態調試里面,我們只能看到每個線程的用戶態棧

一個stack trace是一個線程的一系列函數調用的list

stack是一個LIFO結構(last in first out)意思是后進先出,術語叫做push stack 和pop stack

棧的讀取是自底向上的,最上面的調用是當前正在執行的代碼

下面的例子

Child SP (Stack Pointer)

RetAddr (Return Address)

stack trace里面可以跟蹤系統的執行順序和調用代碼的返回,調試器會構造stack trace 給我們以便于更好的分析

Child-SP          RetAddr           Call Site 00000000`09cbe9e8 00000000`777b2f60 ntdll!NtSignalAndWaitForSingleObject+0xa 00000000`09cbe9f0 00000000`00bdc99e kernel32!SignalObjectAndWait+0x110 00000000`09cbeaa0 00000000`00bc4575 sqlservr+0x1c99e 00000000`09cbed40 00000000`00bc3ea8 sqlservr+0x4575 00000000`09cbed80 00000000`00bdcfad sqlservr+0x3ea8 00000000`09cbf370 00000000`01139d9c sqlservr+0x1cfad 00000000`09cbf430 00000000`032b34c7 sqlservr+0x579d9c 00000000`09cbf650 00000000`00bd2abb sqlservr!TlsGetValueForMsxmlSQL+0x4706d7 00000000`09cbf6c0 00000000`00bd0fda sqlservr+0x12abb 00000000`09cbf7e0 00000000`00bd2665 sqlservr+0x10fda 00000000`09cbf870 00000000`0117abb0 sqlservr+0x12665 00000000`09cbf8e0 00000000`0117c4b0 sqlservr+0x5babb0 00000000`09cbf9a0 00000000`0117a060 sqlservr+0x5bc4b0 00000000`09cbf9d0 00000000`0117a9ef sqlservr+0x5ba060 00000000`09cbfa60 00000000`734937d7 sqlservr+0x5ba9ef 00000000`09cbfaf0 00000000`73493894 MSVCR80!endthreadex+0x47 00000000`09cbfb20 00000000`7775f56d MSVCR80!endthreadex+0x104 00000000`09cbfb50 00000000`77893281 kernel32!BaseThreadInitThunk+0xd 00000000`09cbfb80 00000000`00000000 ntdll!RtlUserThreadStart+0x21

在配置調試器的過程中,最后的步驟是匹配符號,我們打開Windbg的時候我們必須設置我們的符號文件路徑

Symbolic Debugging Files(符號調試文件):幫助調試器把內存里面的各自的函數,類,變量名在內存的位置 匹配到相應的內存地址和位移

如果沒有Symbolic Debugging Files,那么我們將會看到下面只有memory addresses 的stack trace

符號文件的擴展名通常是pdb(如果大家寫C#代碼的時候肯定都會看到過在debug的時候看到bin目錄下會有debug符號文件),調試器能夠很好地解析這種文件格式

Child-SP          RetAddr           Call Site 00000000`09cbe9e8 00000000`777b2f60 ntdll!NtSignalAndWaitForSingleObject+0xa 00000000`09cbe9f0 00000000`00bdc99e kernel32!SignalObjectAndWait+0x110 00000000`09cbeaa0 00000000`00bc4575 sqlservr+0x1c99e 00000000`09cbed40 00000000`00bc3ea8 sqlservr+0x4575 00000000`09cbed80 00000000`00bdcfad sqlservr+0x3ea8 00000000`09cbf370 00000000`01139d9c sqlservr+0x1cfad 00000000`09cbf430 00000000`032b34c7 sqlservr+0x579d9c 00000000`09cbf650 00000000`00bd2abb sqlservr!TlsGetValueForMsxmlSQL+0x4706d7 00000000`09cbf6c0 00000000`00bd0fda sqlservr+0x12abb 00000000`09cbf7e0 00000000`00bd2665 sqlservr+0x10fda 00000000`09cbf870 00000000`0117abb0 sqlservr+0x12665 00000000`09cbf8e0 00000000`0117c4b0 sqlservr+0x5babb0 00000000`09cbf9a0 00000000`0117a060 sqlservr+0x5bc4b0 00000000`09cbf9d0 00000000`0117a9ef sqlservr+0x5ba060 00000000`09cbfa60 00000000`734937d7 sqlservr+0x5ba9ef 00000000`09cbfaf0 00000000`73493894 MSVCR80!endthreadex+0x47 00000000`09cbfb20 00000000`7775f56d MSVCR80!endthreadex+0x104 00000000`09cbfb50 00000000`77893281 kernel32!BaseThreadInitThunk+0xd 00000000`09cbfb80 00000000`00000000 ntdll!RtlUserThreadStart+0x21

上面顯示出我們的模塊,sqlservr.exe 和正在執行的代碼在地址空間里的位移,但是我們不知道具體的函數名,如果有符號映射的幫助(symbols mapped),我們可以獲取到更有意義輸出

Child-SP          RetAddr           Call Site 00000000`09cbe9e8 00000000`777b2f60 ntdll!NtSignalAndWaitForSingleObject+0xa 00000000`09cbe9f0 00000000`00bdc99e kernel32!SignalObjectAndWait+0x110 00000000`09cbeaa0 00000000`00bc4575 sqlservr!SOS_Scheduler::SwitchContext+0x84e 00000000`09cbed40 00000000`00bc3ea8 sqlservr!SOS_Scheduler::SuspendNonPReemptive+0xc5 00000000`09cbed80 00000000`00bdcfad sqlservr!EventInternal<Spinlock<149,1,0> >::Wait+0x428 00000000`09cbf370 00000000`01139d9c sqlservr!ResQueueBase::Dequeue+0x19d 00000000`09cbf430 00000000`032b34c7 sqlservr!CheckpointLoop+0x1aa 00000000`09cbf650 00000000`00bd2abb sqlservr!ckptproc+0x47 00000000`09cbf6c0 00000000`00bd0fda sqlservr!SOS_Task::Param::Execute+0x11b00000000`09cbf7e0 00000000`00bd2665 sqlservr!SOS_Scheduler::RunTask+0xca 00000000`09cbf870 00000000`0117abb0 sqlservr!SOS_Scheduler::ProcessTasks+0x95 00000000`09cbf8e0 00000000`0117c4b0 sqlservr!SchedulerManager::WorkerEntryPoint+0x110 00000000`09cbf9a0 00000000`0117a060 sqlservr!SystemThread::RunWorker+0x60 00000000`09cbf9d0 00000000`0117a9ef sqlservr!SystemThreadDispatcher::ProcessWorker+0x12c 00000000`09cbfa60 00000000`734937d7 sqlservr!SchedulerManager::ThreadEntryPoint+0x12f 00000000`09cbfaf0 00000000`73493894 MSVCR80!endthreadex+0x47 00000000`09cbfb20 00000000`7775f56d MSVCR80!endthreadex+0x104 00000000`09cbfb50 00000000`77893281 kernel32!BaseThreadInitThunk+0xd 00000000`09cbfb80 00000000`00000000 ntdll!RtlUserThreadStart+0x21

從上面的輸出的函數名我們可以看到Checkpoint 線程

上面看到worker thread在CHECKPOINT_QUEUE 隊列里面等待CHECKPOINT 命令

大家可以看到加上符號文件之后,調試器會在stack trace相應的位置進行轉換,例如在模塊名那里加上模塊名,在函數名那里加上函數名

<module_name>!<function call>or<module_name>!<class_name>::<method/function call>


設置符號路徑

設置符號路徑的作用是使調試器可以找到符號文件的位置并進行加載在調試的時候

簡單介紹一下符號路徑和公私有符號文件

私有符號文件:包含了調試會話中需要的所有符號信息(只對微軟內部開放,微軟私有財產)公有符號文件:只是有選擇地包含一些符號信息(對所有人開放)

符號信息隸屬于指定的模塊,只有調試器需要用到某個模塊時,它的符號信息才有被加載和分析的必要。

要在調試器中使用符號,我們必須首先告訴調試器這些符號文件的位置,也就是設置符號路徑。符號路徑可以是本地文件夾路徑、可訪問的UNC路徑、或者是符號服務器路徑

符號服務器:在調試過程中,需要涉及成千上萬個符號文件,以及同一個符號文件存在不同平臺下的不同符號文件版本的時候。

手動設置符號路徑肯定是不現實的,于是引入了符號服務器的概念。

符號服務器有一套命名規則,使得調試軟件能夠正確找到需要的符號文件。一般來說,符號服務器比較大,都是共用的,放在遠程主機上。

為了降低網絡訪問的成本,又引入了符號緩存的概念,即將從服務器上下載到的符號文件,保存在本地緩存中,以后調試器需要符號文件的時候,先從緩存中尋找,找不到的時候再到服務器上下載。

  1、設置符號路徑

  設置符號路徑的語法如下:

.sympath [+] [路徑]

  如要覆蓋原來的路徑設置,使用新路徑即可:

.sympath <新路徑>

  要在原有路徑的基礎上添加一個新路徑,可使用:

.sympath+ <新增路徑>

  如果不帶參數,那么輸出是當前設置的符號路徑:

0:000> .sympathSymbol search path is: <empty>  //尚未設置符號路徑

  假如在調試時,我知道需要的符號文件位于一下文件夾"D:/MyPdb“。

0:000> .sympath D:/MyPdb  //覆蓋原有符號路徑Symbol search path is: D:/MyPdbExpanded Symbol search path is: d:/mypdb

  此時調試器將記錄上面新的符號路徑,但并不會從這個路徑中加載任何符號,要指示調試器加載符號,可以使用元命令reload。

這個命令能枚舉出進程地址空間中所有已加載的模塊,并且嘗試找出與各個模塊相關的符號文件。

0:000> .reloadReloading current modules.....

  如果調試器在指定目錄無法找到文件,那么它會輸出錯誤提示:

*** ERROR:Symbol file could not be found. Defaulted to export symbols for xxx.dll

  當沒有設置本地緩存路徑時,那么調試器將使用調試軟件的安裝路徑下的sym文件夾。

  要特別注意的是,使用.sympath改變或新增符號路徑后,符號文件并不會自動更新,應再執行.reload命令以進行更新。

  

  2、符號服務器與符號緩存

  設置符號服務器的基本語法是:

SRV*[符號緩存]*服務器地址

  語法有SRV引導,符號緩存和服務器地址的前面各有一個星號引導。

  此外,我們總是應該把微軟的公用符號庫加入到我們的符號路徑中:

.sympath+ srv*<緩存地址>*http://msdl.microsoft.com/download/symbols

  這是一臺微軟對外公開的服務器,使用http地址訪問,不是所有人都能牢記這個網址,所以最好的辦法就是使用.symfix命令(自動記憶了上面

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲福利在线观看| 国产成人jvid在线播放| 秋霞午夜一区二区| 亚洲福利视频专区| 亚洲欧美日韩精品久久亚洲区| 亚洲欧美国产视频| 亚洲美女免费精品视频在线观看| 成人a级免费视频| 亚洲国产91色在线| 久久成人这里只有精品| 不卡毛片在线看| 亚洲一区二区三区sesese| 精品久久久久久亚洲国产300| 日韩精品在线电影| 美日韩精品免费视频| 国产98色在线| 亚洲国内精品在线| 日韩欧美国产免费播放| 疯狂欧美牲乱大交777| 成人欧美一区二区三区在线湿哒哒| yw.139尤物在线精品视频| 国产精品香蕉在线观看| 亚洲精品视频中文字幕| 97国产suv精品一区二区62| 中文日韩在线观看| 黄网站色欧美视频| 高跟丝袜一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 欧美激情精品在线| 欧美视频免费在线观看| 欧美特黄级在线| 青青久久av北条麻妃黑人| 俺去了亚洲欧美日韩| 色久欧美在线视频观看| 欧美老肥婆性猛交视频| 久久久久久伊人| 久久精品一偷一偷国产| 国产成人极品视频| 亚洲在线免费视频| 日韩亚洲国产中文字幕| 精品国产网站地址| 国产一区二区三区在线看| 91精品久久久久久久久久久| 91av视频在线免费观看| 最近2019年中文视频免费在线观看| 九九热99久久久国产盗摄| 亚洲精品99久久久久中文字幕| 一区二区三区黄色| 亚洲欧美日本另类| 成人中文字幕+乱码+中文字幕| 青青精品视频播放| 欧美日韩美女视频| 国产日本欧美一区| 欧美在线视频观看| 成人午夜在线视频一区| 性欧美长视频免费观看不卡| 国产99久久精品一区二区 夜夜躁日日躁| 久久99精品久久久久久琪琪| 欧美一区视频在线| 国产欧美日韩中文字幕在线| 91av网站在线播放| 国产亚洲精品va在线观看| 国产丝袜一区二区三区免费视频| 久热在线中文字幕色999舞| 欧美精品videos另类日本| 国产精品91久久久久久| 欧美亚洲国产视频小说| 国产mv免费观看入口亚洲| 欧美性色xo影院| 中文字幕一区电影| 成人乱人伦精品视频在线观看| 久久免费视频这里只有精品| 亚洲va久久久噜噜噜久久天堂| 国产一区二区三区高清在线观看| 91丝袜美腿美女视频网站| 91国产视频在线播放| 亚洲欧美中文日韩在线| 7777免费精品视频| 91精品久久久久久久久中文字幕| 欧美人在线视频| 中文字幕精品在线| 国产一区二区三区在线免费观看| 日韩视频免费在线| 亚洲国产成人精品女人久久久| 国产精品自产拍在线观看中文| 亚洲国产另类 国产精品国产免费| 日韩av电影中文字幕| 亚洲国产精品人人爽夜夜爽| 欧美日韩国产综合新一区| 久久成人国产精品| 国产情人节一区| 国产精品白嫩初高中害羞小美女| 亚洲成色999久久网站| 欧美一级视频免费在线观看| 久久久久久国产精品| 欧美巨大黑人极品精男| 欧美日韩一二三四五区| 国内自拍欧美激情| 亚洲精品国偷自产在线99热| 91在线精品视频| 91久久久久久久| 精品亚洲一区二区三区| 国产精品久久久久一区二区| 欧美日韩性视频在线| 91综合免费在线| 久久国产精品99国产精| 亚洲欧美在线磁力| www.欧美三级电影.com| 日韩网站免费观看高清| 俺也去精品视频在线观看| 伊人久久精品视频| 欧美日韩一区二区免费视频| 91精品久久久久久久久久另类| 精品成人国产在线观看男人呻吟| 91精品久久久久久久| 欧美乱大交xxxxx另类电影| 亚洲色图13p| 久久青草精品视频免费观看| 亚洲美女黄色片| 欧美日韩国产丝袜美女| 国产精品中文久久久久久久| 欧美日韩一区二区免费在线观看| 亚洲激情在线视频| 日韩女优人人人人射在线视频| 国产精品美女午夜av| 国产精品一区二区av影院萌芽| 欧亚精品在线观看| 久久噜噜噜精品国产亚洲综合| 伊人久久精品视频| 国产+人+亚洲| 亚洲国产日韩欧美在线图片| 国产欧美在线播放| 国产精品日韩一区| 中文欧美日本在线资源| 国产精品嫩草影院一区二区| 亚洲天堂成人在线| 欧美wwwxxxx| 欧美夫妻性生活xx| 中文字幕不卡在线视频极品| 欧美极品少妇与黑人| 欧美日韩国产在线看| 国产欧美在线观看| 九九视频直播综合网| 精品美女永久免费视频| 在线日韩av观看| 欧美乱大交xxxxx另类电影| 91日本在线观看| 国语自产精品视频在线看| 懂色av影视一区二区三区| 精品国产一区二区三区久久| 91高清视频免费观看| 国产精品久久久久久久久免费| 亚洲精品一区二区三区婷婷月| 社区色欧美激情 | 欧美激情精品久久久久久黑人| 亚洲精品久久久久久久久久久| 77777少妇光屁股久久一区| 色偷偷888欧美精品久久久| 日韩欧美在线视频免费观看| 精品国偷自产在线视频99| 亚洲国产欧美一区二区丝袜黑人| 久久久电影免费观看完整版| 亚洲欧洲av一区二区| 伊人久久五月天|