0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Valgrind和在线调试器实现Linux应用程序调试系统的设计

电子设计 来源:微计算机信息 作者:潘竹生,童维勤,周 2020-09-25 10:07 次阅读

1.引言

随着嵌入式系统处理能力的显著提高,系统设计越来越复杂,对软件调试提出了新的挑战。传统的调试威廉希尔官方网站 及工具已经难以满足嵌入式软件系统的调试要求。本文介绍了利用工具软件Valgrind 调试嵌入式Linux 应用程序的威廉希尔官方网站 ,嵌入式Linux 继承了传统Linux 功能强大、高效稳定等特点,近年来在嵌入式领域取得了飞速的发展,并且成为主流嵌入式操作系统之一。研究嵌入式Linux 应用程序的调试威廉希尔官方网站 ,不仅能有效提升系统的稳定性,而且从威廉希尔官方网站 和应用角度而言也具有一定的价值。

嵌入式 Linux 应用程序主要使用c/c++开发,多数语法和语义错误可以由编译器发现,但有些错误编译器无法发现,它们往往在程序运行后表现出来。这些错误主要包括:内存泄露、引用未初始化的指针、不恰当释放内存空间、内存越界访问以及使用已经释放的内存空间等等。内存操作在嵌入式编程中大量使用,并且有关内存操作的错误经常出现并且难以被发现。这些错误都会影响系统性能和稳定性,甚至造成瘫痪,所以必须避免它们在程序中出现。通常采用人工方法查找这些错误,当程序规模较大时,工作量将十分巨大,并且效率低下。Valgrind 能够监视应用程序的运行并且发现上述问题,利用Valgrind 对应用程序进行调试能够显著降低人工工作量,提高效率。

2. Valgrind 的工作原理

Valgrind 是运行在Linux 上的多用途代码剖析和内存调试软件。主要包括Memcheck、Callgrind、Cachegrind 等工具,每个工具都能完成一项任务调试、检测或分析。可以检测内存泄露、线程违例和Cache 的使用等。

Valgrind 基于仿真方式对程序进行调试,它先于应用程序获取实际处理器的控制权,并在实际处理器的基础上仿真一个虚拟处理器,并使应用程序运行于这个虚拟处理器之上,从而对应用程序的运行进行监视。应用程序并不知道该处理器是虚拟的还是实际的,已经编译成二进制代码的应用程序并不用重新进行编译,Valgrind 直接解释二进制代码使得应用程序基于它运行,从而能够滴水不漏地检查内存操作时可能出现的错误。在嵌入式应用程序开发中,c 或c++是最为常用的语言,由于这两种语言非常灵活的特性,使得在编程时很容易出现上述错误。因此,为了提高嵌入式系统的可靠性,可以将Valgrind 引入到嵌入式程序的开发过程中,利用它对应用程序进行调试,从而达到高效、准确去除错误的目的。

3.Valgrind 在程序排错中的应用

3.1 嵌入式软件基本开发流程

嵌入式系统是一个资源受限的系统,直接在嵌入式硬件平台上进行软件的开发与调试是不合适的,开发与调试通常需要在PC 机上进行,然后通过交叉编译,将程序编译成可以运行在目标平台上的二进制代码,最后将代码下载到目标硬件平台运行。由于嵌入式Linux 的内核和系统调用与运行在PC 上的Linux 几乎完全一样,因此嵌入式Linux应用程序的调试可以在一台装有Linux 的PC 机上进行。如果能在PC 机的Linux 系统上正常运行,则在目标平台上基本也能正常运行。

3.2 调试过程

本文提出了一种利用Valgrind和在线调试器配合使用的嵌入式程序调试方法,利用它可以结合两种不同软件调试工具的特点,对复杂的嵌入式软件系统进行调试。图1 是嵌入式软件开发与调试的过程。软件设计人员利用已有的开发工具编写源代码,通过编译器、汇编器、链接实时运行库文件,生成目标代码。Valgrind 对目标代码进行仿真执行,调用相关工具进行调试、分析和监测;调试器通过调试器的JTAG 调试接口下载代码,同时对微处理器进行控制,设置软件断点,单步运行等功能查看程序的运行情况。

基于Valgrind和在线调试器实现Linux应用程序调试系统的设计

这里假设 PC 机所用的处理器是x86 指令系统,目标平台处理器是ARM 指令系统。基于Valgrind 的嵌式程序调试过程包括以下几个步骤:

(1)在一台装有Linux 操作系统的PC 机上安装ValgrindValgrind

是一个遵循GPL 条例的开源项目,用户获取到它的源程序后自行编译安装。

获取到源程序包后,使用“cd”命令进入包含源代码的目录;然后输入“。/configure”进行配置;配置完毕后输入“make”对源程序进行编译;编译完成后执行“make install”将编译好的程序和一些数据文件安装到系统的相应位置。至此,Valgrind 安装完成。

(2)将嵌入式程序的源代码编译成运行于x86 处理器的代码格式

使用当前 PC 机Linux 系统中附带的gcc 或g++编译器对源程序进行编译,如果程序较大,拥有较多源代码文件,可以通过编写makefile 文件的方式来对文件进行组织,使用make命令对源程序进行编译。编译时给编译器加上-g 参数,使得编译器添加调试信息到代码中。

(3)启动Valgrind

其中 –leak-check 参数表示让Valgrind 检查内存泄露错误,其他更多的参数项可以参考Valgrind 的相关文档。

(4)根据Valgrind 的检查结果修改源程序

(5)调试完毕后用ARM 编译器编译成ARM 处理器的代码格式

以下几个小节将通过具体的应用威廉希尔官方网站 来具体说明Valgrind 在嵌入式应用程序调试威廉希尔官方网站 中的应用。

3.3 起重机安全监控系统应用程序的调试

起重机安全监控系统使用 Linux2.6 内核作为操作系统,应用程序使用C++语言开发,通过图形界面向用户提供起重机的各种工作情况,如吊臂姿态,吊载重量等等。图形界面使用Qt 图形系统开发。程序源代码*有超过200 处的地方进行了动态内存分配。

将应用程序编译成可以运行在 x86 平台上的二进制代码后,启动Valgrind 执行应用程序,在执行过程中如果发现错误,Valgrind 会将有关信息打印在屏幕上,信息的格式如下所示:

==13380== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==13380== at 0x40046EE: malloc (vg_replace_malloc.c:149)

==13380== by 0x804838B: f1 (aaa.c:4)

==13380== by 0x80483FB: main (aaa.c:20)

“==13380==”表示进程号,一般不用考虑;第一行(“Invalid write.。.”)给出了错误的种

类,这里指发现内存泄露错误。第二行给出了错误发生的地址,以及相关函数。第三行给出了发生错误所在的函数的名称。第四行指出发生错误的函数被调用的地方在main()函数中。

应用程序使用 Valgrind 进行调试发现了所有内存泄露的故障,根据Valgrind 所打印的提示信息到源代码中相应位置进行修改,排除故障,使得应用程序的可靠性得到了增强,使得整个起重机安全监控系统能够非常稳定、可靠的运转。

4.结语

本文介绍了一个功能强大的工具软件 Valgrind,它可以检测多种内存方面的错误。内存错误是嵌入式程序设计中最常见的错误,使用Valgrind 对基于嵌入式Linux 的应用程序进行错误检测,可以迅速准确的检查出各种致命错误,确保及时得到改正,避免在投入运行后出现故障,极大的提高了调试效率。调试工作在PC 机上进行,调试完毕后使用目标平台处理器的编译器对源代码进行交叉编译,从而生成可以运行在目标硬件平台上的二进制代码,整个调试过程非常方便。在资源消耗方面,由于Valgrind 采用虚拟处理器方式运行应用程序,并且使用了V-bit 对每一位数据进行监视,因此使用Valgrind 调试程序时会大量占用内存,并且程序的运行速度要比在实际处理器上运行时的速度慢20 到30 倍。

本文作者的创新点:将Valgrind 工具引入到嵌入式软件调试中,和常用的嵌入式软件调试设备有机地结合成一体,能够迅速准确的查出各种致命的软件错误,提高调试效率,加快产品上市,节省了开发成本,带来实在的经济效益。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19117

    浏览量

    304986
  • Linux
    +关注

    关注

    87

    文章

    11302

    浏览量

    209426
  • 应用程序
    +关注

    关注

    37

    文章

    3268

    浏览量

    57698
收藏 人收藏

    评论

    相关推荐

    MSP调试器用户指南

    电子发烧友网站提供《MSP调试器用户指南.pdf》资料免费下载
    发表于 12-05 14:56 0次下载
    MSP<b class='flag-5'>调试器</b>用户指南

    嵌入式工程师都在找的【Linux内核调试威廉希尔官方网站 】建议收藏!

    Linux内核调试器(KDB) KDB是Linux内核的一个补丁,提供了一种在系统运行时对内核内存和数据结构进行检查的方法。 它允许开发者设置断点、检查内存值、单步执行等,从
    发表于 11-28 15:37

    使用Trace32 (Lauterbach) 作为调试器,无法在电路板中独立运行怎么解决?

    我们使用 Aurix studio 进行开发,使用 Trace32 (Lauterbach) 作为调试器。 现在,当调试器出现时,程序正在运行。 重置电源后,它无法工作。
    发表于 07-04 08:19

    做了个DAPLink调试器,最高支持1500V隔离!静电多不了一点!

    工程名称:基于AT32F415的隔离DAP-Link调试器前言做了一款隔离DAPLink调试器,最高支持1500V隔离(不接入隔离电源情况下可以达到5KV)。能隔离大部分静电!基于AT32F415
    的头像 发表于 06-06 08:05 261次阅读
    做了个DAPLink<b class='flag-5'>调试器</b>,最高支持1500V隔离!静电多不了一点!

    无法从应用程序连接Aurix 387进行调试,怎么解决?

    你好,我无法从应用程序工作室启动连接 Aurix 387 进行调试调试器以下列信息结束:Loading failde:在尝试中化目标内存时发生未知错误有人知道吗?
    发表于 05-21 07:48

    Aurix development studio是否支持GCC调试器

    当我尝试使用 Aurix development studio 调试 Aurix 示例时,我发现只有两个选项 TASKING C/C++ 调试器 winIDEA 调试器 我的问题是,GCC
    发表于 05-20 06:57

    如何自制CAN调试器

    candleLight固件还支持BUSMASTER(这个也就很厉害了,用过的都懂),BUSMASTER是一款功能强大的专业级CAN总线调试软件,不仅能够应对一般的CAN调试开发,还一个用于设计,监测,分析与模拟CAN网络的开源的开放式总线PC软件。
    的头像 发表于 04-15 11:18 954次阅读
    如何自制CAN<b class='flag-5'>调试器</b>?

    STM32 SBSFU的APP程序怎么配置在线调试

    STM32SBSFU的APP程序怎么配置在线调试 目前SBSFU的APP程序都是串口烧录,直接调试会有异常
    发表于 04-10 06:01

    jlink调试器的工作原理

    我们平时使用的jlink调试器就是使用JTAG接口,JTAG以前是用于测试芯片的一种通信方式,现在部分ARM或者DSP等都存在JTAG接口,这样我们就可以通过JTAG接口访问CPU以及其内部状态信息等。
    的头像 发表于 03-08 12:32 3108次阅读
    jlink<b class='flag-5'>调试器</b>的工作原理

    应用单片机开发的ST LINK调试器设计制作

    调试ST单片机的过程中,ST-LINK是一个很好使用的调试工具。今天,我们就根据网络上的设计方案进行简化,设计制作一个ST LINK调试器,用于之后的单片机开发。
    发表于 03-06 10:26 1121次阅读
    应用单片机开发的ST LINK<b class='flag-5'>调试器</b>设计制作

    调试器连接MCU不稳定怎么办?

    有没有小伙伴遇到使用GDlink或者Jlink调试GD32 MCU的时候出现不稳定的情况,刚要发现问题时调试器和MCU断开连接了,这个时候可能抓狂的心都有了。今天就教给大家几个提高调试器连接MCU稳定性的方法。
    的头像 发表于 02-21 09:44 936次阅读
    <b class='flag-5'>调试器</b>连接MCU不稳定怎么办?

    如何使用linux下gdb来调试python程序

    如何使用linux下gdb来调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试
    的头像 发表于 01-31 10:41 2612次阅读

    使用Minwiggler调试器报错的原因?

    根据我的理解,我有英飞凌 A2G TC375LK 套件的 aurix 评估板,它内置了调试器。 我正在使用 Minwiggler 调试器。 但是当我尝试调试时,它给出了错误。 这个调试器
    发表于 01-26 07:22

    TLE9869QXA20可以使用ULINK2/ME Cortex调试器进行调试吗?

    我正在使用TLE9869QXA20定制板,它没有针对我的应用程序的内部调试器,我可以使用 ULINK2/ME Cortex 调试器进行调试吗? 如果是,您能否帮助我处理与定制板的接口和
    发表于 01-23 07:34

    MPLAB® PICkit™ 4 在线调试器用户指南

    电子发烧友网站提供《MPLAB® PICkit™ 4 在线调试器用户指南.pdf》资料免费下载
    发表于 01-07 10:57 6次下载