嵌入式GDB调试与opencv的基础操作

一、GDB的调试练习及其基本用法

1、GDB在调试中的可执行功能

1、设置断点使程序停住
2、 监视或修改程序中变量的值
3、跟踪代码执行过程
注:程序要能被调试,必须包含调试信息

2、GDB的用法及其GDB的调试示例练习

一、gdb调试例子:
功能:
实现对一个整型数的反转功能,比如输入123,则 输出321。 但输入100时,程序的输出结果却不正确,请找出问题。
代码:debug1.c:
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{ int iNum;
printf(“Please input a number :”);
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
二、编译程序,然后调试生成文件
在这里插入图片描述
在编译文件时要用-g的参数编译,然后用gdb调试生成文件
三、查看程序行号,根据行号或者函数名设置断点,便于追踪程序的调试
注:设置断点用命令b(break)
在这里插入图片描述
在GDB中使用l命令查看程序行号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行程序之后,程序根据断点分布执行,在断点处停留,可以查看具体程序信息并且按照自己的进度执行程序,便于监视或修改程序中变量的值和跟踪代码执行过程

3、GDB段错误调试

一、调试例子代码:

sentence1.c:
#include<stdio.h>
#include<string.h>
#define BUFSIZE 256
static char acBuf[BUFSIZE];
static char *pStr;
int main(void)
{
    
    
	printf("Please input a string:");
	gets(pStr);
	printf("\nYour string is:%s\n",pStr);
}

二、编译文件直接运行,发现段错误
在这里插入图片描述
三、在发现错误后,同样,调试文件,并且查看程序具体信息
在这里插入图片描述
四、设置断点重新运行,跟踪程序并且修改程序
在这里插入图片描述
五、生成core文件快速定位段错误位置
在这里插入图片描述
让系统产生core文件 : ulimit –c num,设定core文件容量(num为数字,为0 是不产生core文件)然后 运行程序,让程序崩溃,从而生成core文件,最后gdb配合core文件,定位问题。

5、利用core文件定位内存出错代码(自主练习)

一、练习代码:

contain.c:
#include<stdio.h>
int main()
{
    
    
	int *p=0;
	*p=1;
	return 0;
}

二、编译文件,生成core文件并根据core文件调试,定位错误代码,产生提示信息。
在这里插入图片描述

二、opencv的基本操作与使用

1、opencv的下载与安装

一、首先下载opencv的压缩包之后将压缩包放在home目录下
在这里插入图片描述
二、接下来进入命令行安装opencv
命令顺序:

unzip opencv-3.4.11.zip (解压压缩包)
cd opencv-3.4.11 (进入解压文件里) 
sudo apt-get install cmake (安装cmake)
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev  (安装依赖库) 
mkdir my_build_dir (创建编译文件夹)
cd my_build_dir (进入文件夹进行配置)
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make

此时进入编译过程,过程比较缓慢
然后进入安装环节:

代码顺序:
sudo make install
sudo gedit /etc/ld.so.conf.d/opencv.conf
在上一条命令执行后在弹出的文件末尾输入/usr/local/lib并保存  
sudo ldconfig 
sudo gedit /etc/bash.bashrc  
在上条命令执行后生成的文件最末尾输入PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  并保存
source /etc/bash.bashrc  
sudo updatedb  

此时opencv安装完毕。

扫描二维码关注公众号,回复: 13009322 查看本文章

三、在安装opencv的过程很有可能遇到这样一个问题,在安装依赖库时会出现E: Unable to locate package libjasper-dev这样一个提示信息,会不能定位到 libjasper-dev以至于依赖库不能够正常安装而在编译最后一步是系统找不到Makefile文件,直接停止。
解决方法:

此时直接依次执行如下命令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
sudo apt update
apt list --upgradable
sudo apt install libjasper1 libjasper-dev

此过程比较缓慢,但基本有效,重新实验即可编译成功

2、在opencv下编写进行特效显示的代码

一、进入opencv解压包创建实验文件,将欲编辑的图片放入文件夹里,然后在文件里编写cpp代码
在这里插入图片描述
二、编译.cpp文件,并运行可执行文件,即可出结果

编译命令:
g++ +文件名+ -o+输出文件流名称 +` 支持包
注意:这里是.cpp文件要用g++编译,gcc可能会出问题

动态库存放了链接库的地址,在编译是获取到库文件路径。
在这里插入图片描述
结果:
在这里插入图片描述

注意事项:将要编辑的图片放入此文件夹当中,图片放在home目录下面的话很有可能在运行可执行文件的时候找不到图片,导致最后运行可执行程序不会有=得到任何结果,应该是将图片放在保存程序文件的同一目录下
在这里插入图片描述

3、在opencv下编写一个打开摄像头显示处理视频的程序代码

一、编写.cpp代码,同样用上次g++的命令来编译文件

代码:
#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    
    
VideoCapture capture(0);
while(1)
{
    
    
Mat frame;
capture >> frame;
imshow("读取视频帧",frame);
waitKey(30);
}
system("pause");
return 0;
}

在这里插入图片描述
可能会遇到打不开摄像头,要设置usb控制器,将摄像头接入虚拟机才可以打开,每次开机都要打开一次。

二、
1)如果要求打开你硬盘上一个视频文件来播放,请问代码如何修改?
VideoCapture capture(0)将此行里的参数0改成视频文件名字
2)在第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
Mat实质上是一个矩阵,矩阵行列上的值就是其像素值,表示程序会无限制的等待用户的按键事件,不能删除,此函数会给图像绘制留下时间,不然窗口会出现无响应情况,并且图像无法显示出来
3)此代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
在程序13行后加上

 if(frame.empty())
{
    
    
break;
}

猜你喜欢

转载自blog.csdn.net/rude_dragon/article/details/109303433
今日推荐