很多时候都需要调试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. HarmonyOS之JS/Java跨语言调试

    在 HarmonyOS 应用开发中,通常会涉及到使用 JS 和 Java 语言同时开发的场景,一般使用 JS 来开发应用的 UI,使用 Java 开发应用的逻辑,JS FA 调用 Java PA.针对 ...

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

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

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

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

  4. as的断点调试与高级断点调试

    <div class="markdown_views"><blockquote> 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说A ...

  5. C语言调试教程总结(以visual studio和Dev C++为例)

    文章目录 一.前言 二.调试的概念以及调试器的选择 调试器(Debugger) 1) Remote Debugger 2) WinDbg 3) LLDB 4) GDB 三.设置断点,开始调试 断点的真 ...

  6. Fiddler跨域调试及Django跨域处理

    ------·今天距2021年267天·------ 这是ITester软件测试小栈第109次推文 在上一篇Fiddler系列文章:Fiddler设置断点(一),主要介绍了通过Automatic Br ...

  7. 计算机毕业设计JAVA软考在线题库系统mybatis+源码+调试部署+系统+数据库+lw

    计算机毕业设计JAVA软考在线题库系统mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:L ...

  8. c语言调试时出现的三种错误,C语言课件 第十四章 常见错误和程序调试

    <C语言课件 第十四章 常见错误和程序调试>由会员分享,可在线阅读,更多相关<C语言课件 第十四章 常见错误和程序调试(36页珍藏版)>请在人人文库网上搜索. 1.第十四章常见 ...

  9. 处理器,操作系统,编译器,调试器,语言和工具,网络

    目录 处理器 常用处理器架构.指令集 国产处理器 字长和处理器类型的关系 不同处理器的大小端 查看处理器类型 核与线程之间的关系 如何绑定处理器 基本的汇编原子操作 加减 比较后交换 交换 操作系统 ...

最新文章

  1. 预训练后性能反而变差,自训练要取代预训练了吗?
  2. File-nodejs
  3. spring与springBoot不同之处
  4. 错误传播 --try{}catch(e){console.log(e)}
  5. 量子力学 一 基础6 厄尔米特算符的相容性
  6. 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP...
  7. 漫画:通俗易懂的进程与线程解释
  8. maven构建java web项目(idea开发)
  9. Fatal error in launcher: Unable to create process using ''之解决办法
  10. VS2019离线安装包制作
  11. ubuntu中firfox插件xmarks的同步问题
  12. python五子棋双人对弈_用python实现双人五子棋(终端版)
  13. html如何把素材做成按钮,html botton html submit按钮表单控件与CSS美化
  14. 《用递归法解决问题》教学设计
  15. Vue无缝滚动轮播插件vue-seamless-scroll
  16. C语言:比较三个数(double类型)的大小
  17. CD光盘中CDA格式转音频文件
  18. 高等数学 宋浩 笔记一
  19. 从智能家居产业透视实体经济多元化之辩
  20. 2021腾讯春季校招面经

热门文章

  1. 电子信息计算机调剂到能源动力,江苏科技大学机械、电子信息、电子信息能源动力、土木水利2020年考研调剂信息...
  2. jupyter 导入文件路径_更改jupyter notebook默认存储路径
  3. securecrt遇到一个致命的错误且必须关闭_高性能服务器之路 | 浅谈 Valgrind 内存错误检查神器 Memcheck...
  4. 数据类型(简单数据类型、简单数据类型传参、复杂数据类型传参)
  5. 微信小程序API之video
  6. Javascript 清空input type=file 的值方法
  7. arcgis中python批处理_基于Python的ArcGIS空间数据格式批处理转换工具开发
  8. python保留7天备份文件
  9. python中encode()函数的用法
  10. JAVA大数据-Week4-DAY6-JDBC