很多时候都需要调试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文件了。

启动后,直接按F5,程序就自动在C++的代码中设置的断点处进行中断,如下图所示。

本文完。

GDAL库调试(包括跨语言调试)的更多相关文章

  1. 浅析GDAL库C#版本支持中文路径问题(续)

    上篇博客中主要说了GDAL库C#版本中存在的问题,其表现形式主要是:"文件名中的汉字个数是偶数,完全没有影响,读取和创建都正常,如果文件名中的汉字个数是奇数,读取和创建都会报错." ...

  2. 浅析GDAL库C#版本支持中文路径问题

    GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...

  3. visual stuido 跨解决方案调试

    visual stuido 跨解决方案调试 一个解决方案是一个第三方库,另一个是单独的程序.调试的时候要同时跟踪源码.因为第三方库并没有直接使用它的源码,而是使用生成的dll,直接进行调试比较麻烦,会 ...

  4. 关于基于GDAL库QT软件平台下C++语言开发使用说明

    背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提 ...

  5. Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试

    Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试 会撸码的小马 关注 2018.05.29 17:30* 字数 212 阅读 1488评论 0喜欢 2 接到上一章, ...

  6. 新版 Chrome Ajax 跨域调试

    一.前言 web 开发中 Ajax 是十分常见的技术,但是在前后端使用接口对接的调试过程中不可避免会碰到跨域问题.今天我给大家介绍一个十分简单有效的方法. 跨域经典错误 二.Chrome 跨域设置 首 ...

  7. 如何利用Chrome进行跨域调试

    为什么要跨域调试: 拿嵌入式web开发说,代码都是跑在板子上,我一个优雅的前端开发要每次改完代码都打包到板子上,用板子的地址打开,这是人做的事??? 怎么跨域调试: 1.升级Chrome为最新版本 2 ...

  8. C语言-调试

    1 格式化输出函数printf("%d %s",a,str):格式化控制符之间不能有“逗号”,可以用空格 1.1格式化输入函数scanf(“%d”,t)格式化控制符之间不能有空格 ...

  9. C语言调试器GDB和LLDB的使用方法

    调试器的使用 编译输出带调试信息的程序 调试信息包含:指令地址.对应源代码及行号 指令完成后,回调 LINUX使用GDB MAX使用LLDB 使用说明 // 开始调试testlib程序 lldb te ...

随机推荐

  1. Canvas实现3D效果-可旋转的立方体

    摘要:Canvas画布是一个二维平面,如何展示出3D效果?通过将三维空间中的Z轴抽取出来,将图像的点投影到与Z轴垂直的平面上,在通过旋转等变换效果,我们就能实现3D效果. 一.建立坐标系 1)立方体坐 ...

  2. Rails在MacOS上搭建Heroku部署环境

    heroku只是用postgresql,而不能兼容sqlite数据库.所以很重要的一步就是在部署实际产品的时候将数据库类型修改为postgresql,否则你将无法push到heroku上去. hero ...

  3. 安卓高级6 SnackBar

    引言 文/李牧羊(简书作者) 原文链接:http://www.jianshu.com/p/2654e6bda3b1 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...

  4. Objective-C方法与函数的区别

    Objective-C方法与函数的区别 方法是唯对象所有 函数是不依赖于对象存在的 方法 函数 - (void)test; void test(); 方法是以减号 - 开头 - 类型要用()括起来 - ...

  5. 用Python最原始的函数模拟eval函数的浮点数运算功能(2)

    这应该是我编程以来完成的难度最大的一个函数了.因为可能存在的情况非常多,需要设计合理的参数来控制解析流程.经验概要: 1.大胆假设一些子功能能够实现,看能否建立整个框架.如果在假设的基础上都无法建立, ...

  6. sizeof(结构体)和内存对齐以及位域

    Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该 ...

  7. 2 TileMapObject的使用

    1 CCTMXObjectGroup的使用方法 为了取以下内容: 操作代码如下: T27TileMapObject.h #ifndef __T27TileMapObject_H__ #define _ ...

  8. actionbar完全解析(一)

    Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作.界面导航等功能.使用ActionBar的好处是, ...

  9. maven项目管理

    systemPath方式 有些不通用的包,maven仓库没有,只能通过本地包依赖,就像下面方式: 在需要依赖的项目建lib文件夹,如下: 然后在pom.xml项目管理文件里面加入本地依赖,如下 这种情 ...

  10. leetcode:程序员面试技巧

    起因 写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然很多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有很多不清楚的地方,于是有了对于每道题目写 ...