C 除錯DLL, 定位到原始碼

2021-08-11 14:07:19 字數 2489 閱讀 1261

摘要:   若想實現c#呼叫dll時自動進入到c++專案設定的斷點,需在c#工程右鍵【屬性】->【除錯】->【啟動偵錯程式】中選中【啟動本機**除錯】

在vs2015中用c++建立dll並用c#呼叫且同時實現對dll的除錯

在vs2015中先建立c#專案,然後再建立要編寫的動態庫dll專案,這樣做的好處是整個解決方案的程式設計環境是c#模式,這樣就可以有很多智慧型的提示或快捷的程式設計方式在整個解決方案中都可以使用。

一:建立c#控制台應用程式:用於呼叫c++編寫的dll

(1)啟動vs2015》檔案》新建》專案,在彈出的新建專案對話方塊中按下圖進行選擇填寫,先填寫專案的名稱,再修改解決方案的名稱。

(2)專案建立後,整體效果如下圖:

二:用c++建立dll

下面僅僅建立了dll,具體建立dll的講解請參考【在vs2015中用c++編寫可被其它語言呼叫的動態庫dll】

(1)在解決方案上右擊選擇【新增】>【新建專案】

(2)在新增新專案對話方塊中,按下圖進行選擇填寫

(3)在下圖的建立嚮導對話方塊中進行如下選擇

(4)在下圖的建立嚮導對話方塊中進行如下選擇

(5)專案建立後,整體效果如下圖:

(6)在【標頭檔案】上右擊進行如下選擇

(7)在新增新項對話方塊中進行如下選擇填寫

(8)在createdll.cpp檔案中新增對createdll.h的引用並且新增下圖所示測試**

(9)在createdll.h檔案中新增下圖所示測試**

(10)在【原始檔】上右擊進行如下選擇

(11)在新增新項對話方塊中進行如下選擇填寫

(12)在createdll.def檔案中新增下圖所示測試**

(13)先將解決方案切換到release模式,再在createdll專案名稱上右擊選擇【生成】或【重新生成】

注:release模式下生成的dll才是最終的,debug模式下生成的dll有時會出問題

(14)在解決方案所在的目錄中開啟release資料夾即可看到生成的dll

(15)用dependency walker檢視匯出函式名是否正確,直接將createdll.dll拖到dependency walker軟體介面即可,如下圖

(16)使用dll函式檢視器(3.5)檢視匯出函式名和引數數量是否正確,直接將createdll.dll拖到dll函式檢視器(3.5)軟體介面即可,如下圖

三:用c#專案呼叫c++建立dll

(1)將c#專案設定為啟動專案,並且將解決方案設定為debug模式

(2)在c#專案的program.cs檔案中編寫如下**,**中dll的路徑中的斜槓,測試發現左斜、右斜都可以,**中的相對路徑指的是:編譯後的exe程式相對於dll的路徑

using system;

using system.collections.generic;

using system.linq;

using system.runtime.interopservices;

using system.text;

using system.threading.tasks;

namespace csharpcalldll}}

(3)執行c#專案輸出結果如下

(4)若想實現c#呼叫dll時自動進入到c++專案設定的斷點,需在c#工程右鍵【屬性】->【除錯】->【啟動偵錯程式】中選中【啟動本機**除錯】

(5)在c++專案的原始碼中設定斷點,在debug模式下執行c#程式會自動跳到斷點處,如下圖,從中可以看到c#專案中的值已經傳到c++專案中了

C 和C 生成的dll原始碼聯合除錯

前提 dll和c 工程都有原始碼 第一步 開啟c 工程 第二步 新增dll工程 第三步 設定dll工程為debug模式,並右擊生成,生成的dll會在c 解決方案裡面 第四步 設定c 工程除錯方式為本地除錯,且為debug模式 第五步 設定c 呼叫dll的路徑,dll路徑在c 解決方案中 dllimp...

VS除錯F11進不到dll原始碼

最近研究amazon的aws sdk cpp,是開源的 至少要用vs2013進行編譯,因為 中用到了c 11的新語法。用cmake生成了vs2017的工程,編譯順利的通過了。然後寫了個簡單的測試工程,能正確的編譯和執行,可是除錯時發現f11始終進不到dll的原始碼,而在dll原始碼裡打上斷點後,f5...

libmodbus原始碼生成dll

開發環境 windows10,visual studio 2017 步驟 雙擊 libmodbus src win32 目錄下的 configure.js 檔案,執行該檔案 使用visual studio 2017開啟modbus 9.sln檔案,編譯release版本 編譯時可能會出現如下錯誤 l...