文章

顯示從 2月, 2019 起發佈的文章

[概念] 兩個程序以 IPC 方式建立一個能互相通訊的共享空間

圖片
        在同一Windows系統內的兩個程序要互傳資料,可以用建立內部 TCP 連線方式傳送,不過這種方式不適合大量資料的存取。還有一種方式稱為 IPC (Inter Process Communication),兩個程序之間建立一個共享的空間,透過這塊空間互傳資料互相通訊,參考[1],我們可以把這塊空間看成是一個虛擬檔案,類似開啟檔案的步驟來讀寫它。         首先,雙方有一方要建立共享空間,另一方則是開啟共享空間,如下圖一所示。建立的這方要對這塊空間命名,如果沒有命名,另一方就無法開啟正確的空間。如果我們建立一個很大的空間時,要先讀取目前系統的 available page file 還剩多少,如果不足,那就要加大系統的記憶體容量,參考[2]。當雙方能成功取得這塊共享空間的控制權後,這樣才能利用 MapViewOfFile 函數獲得位址,要留意的一點是位址的 alignment,這塊空間並不是想要指定 到某一位址就能任一指定,它有限制位址必須對齊系統的 AllocationGranularity,所以在規劃空間內部的資料結構時就要先設計安排妥當。         接著,因為存取資料是一個共享空間,所以我們要設計一個互斥鎖保護資料,避免雙方同時存取同一位址而產生資料錯亂,如下圖所示,同樣地建立的互斥鎖也要命名。最後,建立一個事件通知也是需要的,總不能雙方都要輪詢方式來查看資料有沒有更新吧? 當一方寫完資料後,發個事件通知告訴對方,再由對方來讀取,這樣效率會比較好。 圖一:IPC 操作所調用的相關API 參考資料 [1]  Interprocess Communication Between 32-bit and 64-bit Applications [2]  Creating Named Shared Memory

[筆記] Visual Studio 遠端偵錯的設定步驟

圖片
        通常我們用微軟Visual Studio IDE開發程式並且在本機上運行與除錯,但隨著開發系統越來越複雜,程式運行在某台服務器上而不是自己的機器,這時候需要進行遠端程式的除錯,架構如下圖一所示。自己的主機要安裝微軟的Visual Studio 2017 IDE,待測的機器上面要有Remote Debugger工具,雙方透過網路的連線進行除錯。 圖一:遠端除錯與待測機器 [步驟]: 1) 在自己主機上的Visual Studio目錄下面找Remote Debugger這個工具目錄,然後把Remote Debugger工具複製到待測機器上。 2) 程式的除錯屬性要設定正確,屬性頁的遠端Windows偵測工具,如下圖二所示。我們必須設定遠端命令 、 工作目錄 、 遠端機器IP 、連接是否驗證...等等,連線的權限要配合遠端機器的設定。 3) 在遠端機器上的Remote Debugger目錄,開啟 msvsmon.exe,這時只要到工具選單設定連線的權限,如下圖三所示。圖中是設為無權限的方式,不需要驗證使用者。 4) 在VS IDE環境運行遠端Windows偵錯工具,如果發現遠端機器上出現錯誤,錯誤的原因是缺少某些 dll 檔案,如:msvcp140D.dll 、ucrtbased.dll... 。我們在本地主機上找找看這些缺少的檔案,應該能找到,然後再複製到遠端機器的 \Windows\System32 目錄底下。 5) 最後,編譯我們的程式後,要再把exe 、 pdb檔案複製到遠端機器的工作目錄上。接著,運行我們的程式遠端 debug,這樣就可以一步步看著遠端機器上的程式怎麼執行了。 C++遠程偵錯 圖二:C++程式的遠端屬性設定 圖三:遠端機器的連線權限設定 C#遠程偵錯 圖四:C# 程式的遠端偵錯設定