很多時候都需要除錯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#的程式屬性,啟用非託管**除錯,如下圖紅色框區域所示。
第二,需要提前將c++的源**開啟,比如函式registerall的c++**在檔案gdal-1.10.0\ogr\ogrsf_frmts\generic\ogrregisterall.cpp中,開啟該檔案,並在函式開頭新增斷點,如下圖所示。
通過上面兩步設定,就可以通過c#來除錯gdal的源**了。與上面一樣,按f5啟動,同樣可以通過輸出視窗看到是否已經載入pdb檔案了。
本文完。
Chrome 跨域除錯
1 關閉chrome瀏覽器 全部 我們可以通過使用chrome命令列啟動引數來改變chrome瀏覽器的設定,具體的啟動引數說明參考這篇介紹。這裡介紹的是 disable web security引數。這個引數可以降低chrome瀏覽器的安全性,禁用同源策略,利於開發人員本地除錯。2 找到桌面chro...
C語言 除錯
1 格式化輸出函式printf d s a,str 格式化控制符之間不能有 逗號 可以用空格 1.1格式化輸入函式scanf d t 格式化控制符之間不能有空格 2.1 指標 運用指標雖然效率高,但在指標運算時一定要謹慎指標的越界 上界和下界 例如p i 1或者p i 1 i i 必要時要進行邊界值...
visual stuido 跨解決方案除錯
乙個解決方案是乙個第三方庫,另乙個是單獨的程式。除錯的時候要同時跟蹤原始碼。因為第三方庫並沒有直接使用它的原始碼,而是使用生成的dll,直接進行除錯比較麻煩,會提示找不到原始碼。解決辦法如下 將第三方庫和應用程式的生成目錄設定為同乙個目錄 這只是避免每次都要做拷貝工作 設定應用程式除錯的工作目錄為生...