嵌入式LinuxGDB调试以及opencv的功能使用

一、代码的 GDB调试

1、进入GDB调试

GDB : GNU Debugger,是GNU工程为GNU操作系统开发的
调试器,但它的使用不局限于GNU操作系统, GDB可以运行
在UNIX、Linux甚至Microsoft Windows。 • GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编
写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可
运行于不同电脑。
• 使用GDB我们可以:
– 设置断点使程序停住
– 监视或修改程序中变量的值
– 跟踪代码执行过程

1.创建并编写一个one.c文件:

jc@ubuntu:~$ gedit one.c

2.编写一个代码实现对一个整型数的反转功能:

#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);
}

3.利用gcc的-g选项为程序添加调试信息:

jc@ubuntu:~$ gcc -o one -g one.c

输入 gdb one进入gdb调试:

jc@ubuntu:~$ gdb one

出现如下表示已经进入调试:

GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from one...done.
(gdb) 

2、 GDB调试相关命令

1.查看程序代码:
输入l可显示程序代码,每次显示十行,再次输入l或list可查看剩余代码:

(gdb) l
1	#include <stdio.h>
2	void ShowRevertNum(int iNum)
3	{
4	 while (iNum > 10)
5	 {
6	printf("%d", iNum % 10);
7	 iNum = iNum / 10;
8	 }
9	 printf("%d\n", iNum);
10	}
(gdb) list
11	int main(void)
12	{
13	 int iNum;
14	 printf("Please input a number :");
15	 scanf("%d", &iNum);
16	 printf("After revert : ");
17	 ShowRevertNum(iNum);
18	}
(gdb) 

可知代码一共十八行。

2.通过行号设置断点:

(gdb) b 16 //通过行号设置断点
Breakpoint 1 at 0x7d7: file one.c, line 16.
(gdb) b ShowRevertNum //通过函数名设置断点
Breakpoint 2 at 0x725: file one.c, line 4.

3.输入info b可查看所有断点信息:

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000000007d7 in main at one.c:16
2       breakpoint     keep y   0x0000000000000725 in ShowRevertNum at one.c:4

4.运行程序:

(gdb) run
Starting program: /home/jc/one 
Please input a number :100

Breakpoint 1, main () at one.c:16
16	 printf("After revert : ");
(gdb)

5.查看iNum类型:

(gdb) whatis iNum
type = int
(gdb)

执行后还可调试如下命令:

(gdb) c//继续执行
Continuing.

Breakpoint 2, ShowRevertNum (iNum=100) at one.c:4
4	 while (iNum > 10)
(gdb) p iNum// 打印iNum的值
$3 = 100
(gdb) s//单步调试
6	printf("%d", iNum % 10);
(gdb)

3、内存出错的GDB调试

Linux中,程序崩溃时,一般会产生core文件,记录进程退出前
的状态,调试段错误问题,借助于该文件,可快速定位问题。
• 可按如下步骤生成和使用core文件
– Step 1: 让系统产生core文件
• ulimit –c num #设定core文件容量(num为数字,为0
是不产生core文件) – Step 2: 运行程序,让程序崩溃,从而生成core文件
– Step 3: gdb配合core文件,定位问题
• gdb 程序名 core文件名
• 比如: gdb two core

1.用gedit创建并编辑一个文件:

jc@ubuntu:~$ gedit two.c

2.输入代码如下:

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

3.使用GDB调试程序:

jc@ubuntu:~$ gcc -o two -q two.c

4.产生core文件:

jc@ubuntu:~$ ulimit -c 1000
jc@ubuntu:~$ ./two//运行程序,让程序崩溃产生core文件。
段错误 (核心已转储)

5.最后输入gdb 程序名 core文件名:

jc@ubuntu:~$ gdb two core

最后得到结果如下:

GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from two...done.
[New LWP 2723]
Core was generated by `./two'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000561d66b2260a in main () at two.c:5
5	        *p=1;

由最后‘5 *p=1 ’得知代码程序错误在这。

二、opencv简单使用

1、ubantu下安装opencv-3.4.1

1.在官网或其他渠道下载,详细参考该博主.
2. 将下载的压缩包放入home目录下,然后进行解压:

unzip opencv-3.4.1.zip

3.进入解压的文件中:

cd opencv-3.4.1

4.安装依赖库和cmake ,如果提醒需要apt-get update,那就先sudo su进入root权限,再sudo apt-get update,然后在执行下面命令

jc@ubuntu:~/opencv-3.4.1$ 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  

注:如果出现 libjasper-dev目录定位问题,则提供如下安装步骤,依次输入如下命令:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev

5.创建编译文件夹。进入文件夹进行配置

jc@ubuntu:~/opencv-3.4.1$ mkdir my_b_dir//创建文件夹
jc@ubuntu:~/opencv-3.4.1$ cd my_b_dir//进入文件夹编译
jc@ubuntu:~/opencv-3.4.1/my_b_dir$ 

  1. cmake一下:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

然后执行 sudo make命令。
==注:可用多线程来加快编译速度,比如: make -j4, 表示用 4个线程来编译, 速度明显提升。 ==
下载完成后执行命令:

sudo make install

7.完成后,sudo make install 执行完毕后OpenCV编译过程就结束了,接下来就需要配置一些OpenCV的编译环境首先将OpenCV的库添加到路径,从而可以让系统找到

sudo gedit /etc/ld.so.conf.d/opencv.conf 

执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加/usr/local/lib 。

8.保存回到命令行界面
执行如下命令使得刚才的配置路径生效

sudo ldconfig  

9.配置bash

sudo gedit /etc/bash.bashrc  

在末尾fi下一行添加如下代码:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  

10.保存,执行如下命令使得配置生效

source /etc/bash.bashrc  

更新:

sudo updatedb  

至此所有的配置都已经完成。

2、 Linux编程

1、编写一个打开图片进行特效显示的代码

1.在opencv-3.4.1下新建文件夹mytet

cd opencv-3.4.1//进入opencv-3.4.1
mkdir mytet//创建mytet文件

2.创建cpp文件:

touch tet.cpp

进入文件编程:

sudo gedit  /tet.cpp

在电脑上选择一张图片,放在home目录下并改名为lena.jpg。
3.输入如下代码:

#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
	CvPoint center;
    double scale = -3; 

	IplImage* image = cvLoadImage("lena.jpg");
	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<image->height;i++)
		for (int j = 0;j<image->width;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("tet",1);  	imshow("tet", src);
	 cvWaitKey();
	 return 0;
}

4.保存代码并退出输入如下命令:
此时myste里面应有tet文件和tet.cpp文件。

g++ tet.cpp -o tet `pkg-config --cflags --libs opencv`
./tet//运行程序

如果出现以下问题:

Gtk-Message: 06:39:33.411: Failed to load module “canberra-gtk-module”

则用如下代码解决:

 sudo apt-get install libcanberra-gtk-module

5.完成后,由于图片在home目录,特此将tet文件复制与home目录。
然后退出,执行

jc@ubuntu:~/opencv-3.4.1/mytest$ cd
jc@ubuntu:~$ ./tet

运行成功:
在这里插入图片描述

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

在上面实验中创建的mytest文件下进行下面实验
1.创建一个tet1.cpp文件,并编译它:

touch tet1.cpp//创建tet1.cpp
gedit tet1.cpp//进入文件编译

编译代码如下:

 /*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int main()
{
	//打开电脑摄像头
	VideoCapture cap(0);
	if (!cap.isOpened())
	{
		cout << "error" << endl;
		waitKey(0);
		return 0;
	}

	//获得cap的分辨率
	int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
	int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	Size videoSize(w, h);
	VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
	
	Mat frame;
	int key;//记录键盘按键
	char startOrStop = 1;//0  开始录制视频; 1 结束录制视频
	char flag = 0;//正在录制标志 0-不在录制; 1-正在录制

	while (1)
	{
		cap >> frame;
		key = waitKey(100);
		if (key == 32)//按下空格开始录制、暂停录制   可以来回切换
		{
			startOrStop = 1 - startOrStop;
			if (startOrStop == 0)
			{
				flag = 1;
			}
		}
		if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
		{
			break;
		}

		if (startOrStop == 0 && flag==1)
		{
			writer << frame;
			cout << "recording" << endl;
		}
		else if (startOrStop == 1)
		{
			flag = 0;
			cout << "end recording" << endl;
			
		}
		imshow("picture", frame);
	}
	cap.release();
	writer.release();
	destroyAllWindows();
	return 0;
}

2.保存退出,执行如下命令:

g++ tet1.cpp -o a `pkg-config --cflags --libs opencv`
./tet1          //执行tet1程序

如果出现问题考虑在设置里修改usb控制器,将USB兼容性改为USB3.0
然后退出重启虚拟机。

3.最后运行成功摄像头开启:
在这里插入图片描述
直接按ESC可退出。可以在mytest文件中找到并观看摄像头录制的视频。

三、总结

本次实验较为详细的了解关于代码的GDB调试,掌握了内存出错的GDB调试,对于相关命令有了深的理解。
知道了安装并学会使用opencv,学会了打开图片进行特效显示的代码以及打开摄像头显示处理视频的程序代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值