簡體   English   中英

如何在Visual Studio中的DLL上設置斷點?

[英]How to set a breakpoint on a DLL in Visual Studio?

我正在研究DLL(用C ++編寫)的源代碼,該DLL是另一個程序的插件。 沒有文檔,而且我沒有主程序的源代碼。 我試圖弄清楚主程序在何時何處調用DLL。 有100多個標記為DllExport函數,因此僅此一項並沒有多大幫助。

為此,如果每次執行到達DLL中的代碼時都可以觸發一個斷點,那就太好了。 那或記錄在某個地方。 這有可能嗎?

ew,這是您的一項相當要求。 但老實說,即使對於其他情況,這也可能確實有用。

我認為可以實現此目的的最簡單方法是使用WinDbg並在那里設置斷點。 使用WinDbg,您可以執行以下操作(假設您的映像名為myplugin.dll ):

  1. 打開WinDbg
  2. File- > Symbol File Path (添加插件的.pdb所在的路徑)
  3. 文件 -> 源文件路徑 (添加插件源所在的路徑)
  4. 文件 -> 圖像文件路徑 (添加插件DLL本身所在的路徑)
  5. 文件 -> 打開可執行文件 (或附加到現有進程,選擇主應用程序)
  6. 在命令行上: bm myplugin!*
  7. 運行程序(F5)

步驟6將在myplugin.dll中的每個符號處添加一個斷點。 但請注意:這實際上會在每個函數上添加一個斷點,即使在您可能尚未定義自己但通過標頭(如STL)包含的函數上也是如此。 這是在模塊中各處設置斷點的最根本的方法。 如果以所有導出函數都位於名稱空間中或帶有前綴的方式對插件進行編程,則可以縮小搜索模式並獲得更准確的斷點。 假設所有您感興趣的函數都以PLG_為前綴,那么您將編寫:

bm myplugin!PLG_*

相應地設置每個斷點-非常簡單

當然,缺點是您必須使用外部調試器。 Visual Studio確實支持功能相似的功能斷點 ,但據我所知,它們要么在每種情況下都不適用於通配符,要么它們已在VS2013 +中進行了更改(其中之一)。

這是我所知道的最簡單的方法(不是沒有,但我只是不知道)。 第二個最簡單的方法:手動添加一次斷點,如果以后需要再次使用斷點,則保存您的.suo文件。 這是一項繁瑣的任務,但是尋找一個更快的解決方案可能比手工完成要花費更多的時間(算在一個工作日內)。

其他情況是您編寫了一個程序,該程序在導出的函數的開始處添加了一個蹦床(讀取PE標頭並獲取函數的RVA),並帶有int 3和原始指令,但這太過頭了-您很容易擁有在執行此操作之前,將斷點手動設置為1000個函數。

另一種方法是更改​​存儲斷點的.suo解決方案選項文件。 但是,據我所知,這些只能通過Visual Studio的擴展性API獲得,這意味着您必須為Visual Studio本身編寫一個插件或宏。

我對此也很感興趣。 因此,我將在一段時間內觀察這個問題,也許有人會知道更簡單的解決方案。 如果您是WinDbg的新手,只需添加一條評論,我將盡力解釋您如何獲得它以及它如何工作的:)

暫無
暫無

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

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