Linux应用程序调试方法

1.概述    

可应用与嵌入式的操作系统有Linux、VxWorks等,VxWorks的调试较简单,因为没有虚拟内存的限制,所以支持直接修改内存数据,且支持符号表,因此在shell中可以直接数据全局函数或变量进行运行调试。

Linux有虚拟内存,且不能够直接运行全局函数或全局变量赋值,因此在调试阶段不方便,本文提供一种Linux的调试方法,并附测试源码,该源码可添加进应用程序中进行调试使用,改源码对外提供接口函数,包含相应的.h文件则可以直接调用接口,使用较简单。

2.Linux调试方法

Linux系统应用程序在开发阶段,在涉及到协议解析时经常需要打印接收、发送、或中间过程数据,不可能每修改一次进行编译烧写测试,这样效率较低,因此可以使用全局变量控制打印开关,从而控制打印的方法,但是Linux不像VxWorks支持直接修改全局变量,因此需要一种修改全局变量的方法,如下提供几种方法:

1)scanf函数

应用程序中编写一个线程主要使用scanf接收终端写入的数据,从而修改全局变量达到控制打印开关的目的。

优点:实现简单,可以应用于Linux嵌入式板卡,使用一个串口即可进行调试;

缺点:与应用程序使用同一个终端,打印较乱。

2)共享内存

进程间通信共享内存的方式修改全局变量。

3)配置文件

读取配置文件控制打印开关

4)socket方式

提到的socket方式有两种,一种为本地socket,一种为使用TCP协议的不在同一个主机的socket。

本地socket通信,可以部署在同一个单板上,需要开启两个终端,一个终端启动debug进程,该进程负责发送控制变量,另一个终端启动应用程序进程,该进程包含调试线程,该线程负责接收发送进程的控制数据,实现开关的控制。部署如图所示

Linux应用程序调试方法_第1张图片

 图1 本地socket通信调试

使用TCP协议通信可以实现使用主机调试单板,在主机虚拟机部署debug进程,嵌入式单板程序中包含debug线程,该线程负责接收发送进程的控制数据,实现开关的控制。部署如图所示

Linux应用程序调试方法_第2张图片

图2 主机调试嵌入式单板

3.部署及配置

1)如图1调试方式,则程序配置方式如下:

debug_ctl文件夹为调试发送进程,需要根据不同部署进行配置。

#define  TCP_CONNECT    //不需要定义

#define  CLIENT_LOCAL_COMM_PATH    "/home/debug_sock_path"

work_space文件夹debug_ctl.c文件中定义

#define  TCP_CONNECT    //不需要定义

#define  SERVER_LOCAL_COMM_PATH    "/home/debug_sock_path"

2)如图2调试方式,则程序配置方式如下:

debug_ctl文件夹为调试发送进程,需要根据不同部署进行配置。

#define  TCP_CONNECT    //对TCP_CONNECT进行宏定义

宏定义IP地址和端口号

#define  TARGET_IP   ("127.0.0.1")

#define  PORT        (5678);

work_space文件夹debug_ctl.c文件中定义

#define  TCP_CONNECT    //对TCP_CONNECT进行宏定义

宏定义IP地址和端口号

#define  PORT        (5678);

4.使用方式

应用程序运行后,等待debug进程运行,该进程参数为-31~+31;

已经提前使用的变量

        -1:打开所有的开关;

        0:关闭所有的开关;

        1:打印开关帮助;

        2 ~ 31 为打开开关;

        -2 ~ -31关闭相应的开关。

5.接口函数

1.int debug_ctl_init( void )

函数功能:

该函数初始一个debug线程,该线程为服务器端,负责接收控制开关

2.get_switch_status( unsigned int temp )

函数功能:

    该函数获取特定位是否为1,从而控制开关。

参数unsigned int temp

    打印开关控制变量。

示例:

if(get_switch_status( 1 << 12 ))
{
    printf("1<<12\r\n");
}

判断变量1左移12位是否为1,若为1则输出打印。

6.原理

 资源:

https://download.csdn.net/download/jianzhao6205/86395109

你可能感兴趣的:(Debug程序,linux)