很多時候都需要調試GDAL庫,尤其是像學習GDAL庫中的某些演算法是如何?的時候,調試就必不可少了。
首先說明用C++的調試。以VS2008為例進行說明。
編譯DEBUG版本的GDAL庫,這個可以參考我之前的部落格。可以用命令列編譯,也可以用IDE編譯,但是實質都是一樣,修改nmake命令的參數。也就是給nmake命令後加一句DEBUG=1即可。
編譯完成之後,應該會在gdal的源碼目錄中產生下面幾個檔案,如。
調試時用到的檔案主要就是pdb檔案,請確保pdb檔案存在,大小應該在30M以上說明是可以調試的,有時候產生的pdb檔案會小於10M,這時應該清理GDAL的工程,然後重新編譯就好了。
將上面gdal110.dll、gdal110.pdb、gdal110.ilk等檔案拷貝至你的測試工程中的exe所在目錄,然後使用調試方式啟動程式,在程式調用GDAL庫中的函數時,按F11鍵應該就可以進入GDAL的源碼檔案中。
如果GDAL的pdb檔案在程式啟動時沒有載入,就不能進入GDAL的源碼。判斷是否載入GDAL的pdb檔案,可以在VS的輸出視窗中看到“gdal110.dll已載入符號”的字樣就說明載入成功,可以調試,如所示。
然後在程式中添加斷點即可。在OGRRegisterAll函數處設定斷點,如。
程式執行到該句之後,按F11鍵,程式自動會跳轉到GDAL源碼檔案中,如所示:
然後就可以調試GDAL的原始碼了,其他函數類似。或者你提前將要調試的GDAL源碼用VS開啟,添加斷點,然後直接按F5,不出意外的話,程式會在GDAL源碼中設定的斷點處進行暫停。
跨語言調試(以C#為例)
GDAL同時可以跨語言調試,下面以C#為例進行說明。
首先請確保編譯的GDAL版本是debug的版本,具體方式參考上面或者之前的部落格。編譯完C++版本的Debug的GDAL庫後,接下來編譯C#版本,同樣也要編譯Debug版本。具體方式與編譯C++類似,也是在編譯時間指定DEBUG=1即可。編譯命令如:
編譯完之後,在gdal\swig\csharp目錄中可以看到一大批exe、pdb檔案。如果編譯的不是Debug版本,是不會產生pdb檔案的。可以通過是否產生pdb檔案來判斷編譯的是否debug版本。如所示。
將上面編譯的C#版本中的八個dll以及對應的pdb、lib、ilk、exp等檔案一同拷貝到C#的測試程式中exe所在目錄。如所示。
接下來在C#引用中,添加C#版本八個dll中檔案名稱中帶有_csharp的四個dll。
然後在C#代碼中的Ogr.RegisterAll()函數處設定斷點,如所示。
編譯通過後,按F5啟動偵錯模式。程式在斷點處中斷,然後按F11,VS會自動進入swig封裝的C#代碼中,如所示。
此時接下來,再按F11是不可能進入C++的原始碼中。要進入C++的原始碼中,要進行下面的設定。第一,設定C#的程式屬性,啟用Unmanaged 程式碼調試,如紅色框地區所示。
第二,需要提前將C++的原始碼開啟,比如函數RegisterAll的C++代碼在檔案gdal-1.10.0\ogr\ogrsf_frmts\generic\ogrregisterall.cpp中,開啟該檔案,並在函數開頭添加斷點,如所示。
通過上面兩步設定,就可以通過C#來調試GDAL的原始碼了。與上面一樣,按F5啟動,同樣可以通過輸出視窗看到是否已經載入pdb檔案了。
啟動後,直接按F5,程式就自動在C++的代碼中設定的斷點處進行中斷,如所示。
本文完。