完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
一.在Ubuntu系统上练习程序代码的GDB调试
1.什么是GDB GDB : GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系 统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。 • GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可运行于不同电脑。 使用GDB我们可以: ①:设置断点使程序停住 ②:监视或修改程序中变量的值 ③:跟踪代码执行过程 2.使用方法 程序要能被调试,必须包含调试信息。 编译程序时,通过gcc的-g选项为程序添加调试信息,例如: gcc –g –o helloworld helloworld.c 3.启动GDB gdb [程序名] 4.GDB命令 • file 装入想要调试的可执行文件。 • kill 终止正在调试的程序。 • list 列出产生执行文件的源代码的一部分。 • next 执行一行源代码但不进入函数内部。 • step 执行一行源代码而且进入函数内部。 • run 执行当前被调试的程序。 • c 继续运行程序。 • quit 终止gdb。 • watch 使你能监视一个变量的值而不管它何时被改变。 • backtrace 栈跟踪,查出代码被谁调用。 • print 查看变量的值。 • make 使你能不退出gdb就可以重新产生可执行文件。 • shell 使你能不离开gdb就执行UNIX shell命令。 • whatis 显示变量或函数类型。 • break 在代码里设断点,这将使程序执行到这里时被挂起。 • info break 显示当前断点清单,包括到达断点处的次数等。 • info files 显示被调试文件的详细信息。 • info func 显示所有的函数名称。 • info local 显示当函数中的局部变量信息。 • info prog 显示被调试程序的执行状态。 • delete [n] 删除第n个断点。 • disable[n] 关闭第n个断点。 • enable[n] 开启第n个断点。 • ptype 显示结构定义。 • set variable 设置变量的值。 • call name(args) 调用并执行名为name,参数为args的函数。 • Finish 终止当前函数并输出返回值。 • return value 停止当前函数并返回value给调用者。 • break命令的使用 – 根据行号设置断点: • (gdb) break linenum – 根据函数名设置断点: • (gdb) break funcname – 执行非当前源文件的某行或某函数时停止执行: • (gdb) break filename:linenum • (gdb) break filename:funcname – 根据条件停止程序执行: • (gdb) break linenum if expr • (gdb) break funcname if expr 5.GDB调试举例 我们用下图代码为例,实现对一个整型数的反转。 #include void ShowRevertNum(int iNum) { while (iNum > 10) { printf("%d", iNum % 10); iNum = iNum / 10; } printf("%dn", iNum); } int main(void) { int iNum; printf("Please input a number :"); scanf("%d", &iNum); printf("After revert : "); ShowRevertNum(iNum); } 在ubuntu下创建一个test.c文件,编译 运行程序,我们发现我们输入的数字是100,而输出的确实010,出现了问题,这个时候我们就可以用GDB来对程序进行调试。 代码调试阶段 继续运行 通过最后调试,我们发现是当iNum的值等于10的时候,代码循环就结束了。所以我们应该修改我们的代码,修改后调试运行。 6.内存出错的GDB调试 • Linux中,程序崩溃时,一般会产生core文件,记录进程退出前的状态,调试段错误问题,借助于该文件,可快速定位问题。 • 可按如下步骤生成和使用core文件 – Step 1: 让系统产生core文件 • ulimit –c num #设定core文件容量(num为数字,为0是不产生core文件) – Step 2: 运行程序,让程序崩溃,从而生成core文件 – Step 3: gdb配合core文件,定位问题 • gdb 程序名 core文件名 • 比如: gdb segDemo core (1)构建函数,创建文件,输入代码 #include 二.在Ubuntu16/18系统下练习编译、安装C/C++图像处理开源软件库 Opencv3.x 1.安装opencv-3.4.1 在opencv官网下载3.4.1版本,可以直接复制文件到虚拟机上。 参考网站:Opencv官网 ①将复制的包放在Home目录下 解压复制的文件 unzip opencv-3.4.12.zip ②进入解压后的文件 cd opencv-3.4.12 ③安装依赖库和cmake ,如果提醒需要apt-get update,那就先sudo su进入root权限,再sudo apt-get update,然后在执行下面命令 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev ④安装完cmake之后执行命令 ,创建编译文件夹 创建编译文件夹 `mkdir my_build_di`r 进入文件夹进行配置 cd my_build_dir cmake一下 cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. ⑤执行命令,经过漫长的编译过程 sudo make 下载完成 执行:sudo make install 2.配置OpenCV的编译环境 将OpenCV的库添加到路径,从而可以让系统找到 sudo gedit /etc/ld.so.conf.d/opencv.conf 在跳出的文本框的内输入/usr/local/lib 执行命令 sudo ldconfig 配置bush sudo gedit /etc/bash.bashrc 弹出这样一个窗口 在末尾添加如下框中的代码 执行如下命令使7配置成功 source /etc/bash.bashrc 更新 sudo updatedb 3.图像处理 1.在opencv-3.4.1下新建文件夹mytest 在目录下存放一张图片 再次移动到刚创建的mytest文件夹中。 2、创建函数test.cpp touch test.cpp 1 进入编程 sudo gedit /test.cpp 1 在文本框中敲入代码 #include #include using namespace cv; using namespace std; int main(int argc, char** argv) { CvPoint center; double scale = -3; IplImage* image = cvLoadImage("1.png");//切记图片命名要与程序中的命名相同包括大小写 argc == 2? cvLoadImage(argv[1]) : 0; cvShowImage("Image", image); if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2); for (int i = 0;i for (int j = 0;j double dx = (double)(j - center.x) / center.x; double dy = (double)(i - center.y) / center.y; double weight = exp((dx*dx + dy*dy)*scale); uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3); ptr[0] = cvRound(ptr[0] * weight); ptr[1] = cvRound(ptr[1] * weight); ptr[2] = cvRound(ptr[2] * weight); } Mat src;Mat dst; src = cvarrToMat(image); cv::imwrite("test.png", src); cvNamedWindow("test",1); imshow("test", src); cvWaitKey(); return 0; } 三、使用opencv简单使用摄像头(因为我台式电脑没有摄像头,所以很多没有展示) 1、首先要将虚拟机摄像头USB配好 Win+R打开cmd 输入services.msc把虚拟机的USB服务打开如图所示 2、设置虚拟机 在虚拟机菜单栏中选择“虚拟机(M)”->选择“可移动设备”->选择最后一行选项->选择“连接(断开与主机连接)”,设置完这项之后,虚拟机接管了笔记本摄像头。 因为我台式电脑的问题没有摄像头,所以它没有找到文件 输入代码打开摄像头 cheese 就到这里了。 代码解释: 1、如果要求打开你硬盘上一个视频文件来播放,请问第7行代码如何修改? VideoCapture capture(“视频名.mp4”);四.总结 没多次都是安装和配置环境比较麻烦,最后的运行和测试都比较简单,所以下次会做得更好。 |
|
|
|
只有小组成员才能发言,加入小组>>
639 浏览 0 评论
1076 浏览 1 评论
2448 浏览 5 评论
2773 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2605 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
629浏览 9评论
625浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
751浏览 6评论
600浏览 5评论
647浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-3 06:47 , Processed in 0.982707 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号