2011-06-10 23 views
28

當我在目標上通過windbg -kntsd -d時,我無法使源代碼在windbg中顯示,但它在我本地調試時起作用。如何通過ntsd -d在windbg中顯示源代碼?

我想調試Winlogon.exe和LSASS.exe的第一個代碼執行。但是,可以很容易複製的問題,我做了這個設置:

  • 我用的是CrashMe sample application,帶源和預建的符號,複製到C:\ CrashMe目標和主機
  • 兩我使用Windows調試工具(DTW)6.12.0002.633版本。
  • 目標是運行Windows XP SP3,主機Windows 7的終極。
  • 每臺機器上的路徑和設置都是相同的:DTW路徑和crashme路徑。
  • 我總是使用完全合格的路徑(如c:\ dtw \ ntsd.exe)。
  • 我運行在一個虛擬機中的XP,用/noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

我能夠用這個命令,由C發起本地調試啓動:\ CrashMe:

windbg -g -G -srcpath C:\CrashMe -y C:\CrashMe debug\CrashMe.exe 

我可以啓動Windows XP虛擬機並用此命令連接到它:

windbg -n -k com:pipe,port=\\.\pipe\com_1,reconnect -srcpath SRV*;C:\CrashMe -y 
c:\windows\system32;c:\windows\symbols;C:\CrashMe\debug 

但我需要調試遠程機器。在目標,我有以下選擇:

  1. 調試通過-server-remote
  2. 在運行過程
  3. 使用圖像文件執行選項(IFEO)斷裂。

在每個選項中,我都可以看到符號(x crashme!*)。

我不能使用#1(-server)或#2(breakin.exe <pid>),因爲我想調試身份驗證提供的啓動代碼,所以我需要ntsd -dLSASS.exe開始。我不能讓它運行並在以後加入。

我的理解是我需要使用IFEO。使用gflags.exe,而不是手動修改註冊表的,我設置可執行選項

c:\dtw\ntsd -d -G -lines -x -y c:\symcache;c:\windows\system32 -n -srcpath C:\CrashMe\ 
  • 我可以唱到的應用程序,但我的斷點設置是從不打。
  • 我可以.open任何文件,但我不能使用該文件來設置斷點。
  • 我可以x(檢查)任何符號
  • 我看不到源代碼。

如何查看我在ntsd -dwindbg -k下運行的進程的DLL源代碼?

+0

我仍然沒有找到答案,但它可能與ntsd沒有關係一個圖形調試器? – ixe013 2012-01-21 02:11:20

+0

在相關說明中,在完全相同的設置下,我可以用windbg中的完整源代碼調試內核驅動程序。 – ixe013 2012-01-21 02:12:04

+0

如果你可以調試一個驅動程序,你已經有一個連接,也可以用來調試用戶模式代碼(即你的應用程序)。 – 0xC0000022L 2012-03-29 01:37:29

回答

1

TL; DR:使用服務器<TRANSPORT> -ddefer並通過第二個windbg連接進行連接,第二個windbg會話設置.lsrcpath設置爲獲取所需內容。

其餘部分: 源模式需要從運行調試器的系統訪問源文件。在通過內核模式連接調試用戶模式代碼的情況下,這變得棘手。由於測試在目標計算機上的ntsd上下文中執行,並且該計算機被分解爲調試器,因此加載源文件通常不起作用。我相信如果你在目標機器上放置一個完整的源代碼樹或將源路徑指向一個共享目錄,它可能會,但我沒有證實。

我所做的驗證是you can use this method to get source files loaded in your host machine.

這是通過執行以下操作:在目標機器上

  1. 啓動你的主機內核調試器
  2. 啓動NTSD用(例如)`NTSD - server tcp:port = 50000 -ddefer test.exe
  3. 開始連接到您的調試服務器(例如在WinDbg中,我使用ctrl + r`tcp:port = 50000,server = tawnos-target`)
  4. 連接將掛起。切換到你的內核調試器(它應該位於Input>)並運行`.sleep 5000`來允許連接完成
  5. 此時,應該完成遠程連接。您現在可以根據需要重新加載符號,並使用.lsrcpath設置windbg將使用的srcpath以查看源代碼
+0

你很可靠,使用'-server'適用於普通用戶模式的進程。我在我的(長篇)文章中提到過它。但是,我怎樣才能使用'-server'選項來調試lsass或winlogon,我不能自己啓動? – ixe013 2012-06-23 01:48:28

+0

如果我沒有弄錯,這會有效(我可以在星期一測試)。將'-server'和'-ddefer'結合起來,而不是僅僅使用'ntsd -d'。這將使您既可以獲得初始流程啓動的好處,又可以遠程查看源代碼。 如果週一沒有聽到更多消息,我會驗證並向您報告。 – Tawnos 2012-06-23 22:47:52