CN111611161B - 一种应用于航空电子软件的轻量级调试工具的实现方法 - Google Patents

一种应用于航空电子软件的轻量级调试工具的实现方法 Download PDF

Info

Publication number
CN111611161B
CN111611161B CN202010429409.0A CN202010429409A CN111611161B CN 111611161 B CN111611161 B CN 111611161B CN 202010429409 A CN202010429409 A CN 202010429409A CN 111611161 B CN111611161 B CN 111611161B
Authority
CN
China
Prior art keywords
debugging
thread
command
symbol
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202010429409.0A
Other languages
English (en)
Other versions
CN111611161A (zh
Inventor
吴夏风
赵羚钧
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CETC Avionics Co Ltd
Original Assignee
CETC Avionics Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by CETC Avionics Co Ltd filed Critical CETC Avionics Co Ltd
Priority to CN202010429409.0A priority Critical patent/CN111611161B/zh
Publication of CN111611161A publication Critical patent/CN111611161A/zh
Application granted granted Critical
Publication of CN111611161B publication Critical patent/CN111611161B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种应用于航空电子软件的轻量级调试工具的实现方法,调试工具包括提供用户操作界面的调试工具进程和嵌入目标进程的调试线程,它们之间通过socket通信;本发明方法通过在目标进程中嵌入调试线程,调试线程驻留在目标进程中,用于完成符号表解析、内存读写、堆栈分析和代码段执行;所有目标程序的标准输出和标准异常输出均通过linux提供的dup系统调用接口重定向到socket句柄上,从socket传递到调试工具进程,调试工具进程收到数据后展示到操作控制界面上。本发明提供一款没有外部依赖的,支持linux操作系统平台的,不会导致目标程序“暂停”的轻量级调试工具,尤其适用于机载嵌入式软件技术领域。

Description

一种应用于航空电子软件的轻量级调试工具的实现方法
技术领域
本发明涉及机载嵌入式软件技术领域,尤其涉及一种应用于航空电子软件的轻量级调试工具的实现方法。
背景技术
随着电子技术的发展,在民用航空电子(Avionics)领域,机上系统也越来越庞大,系统内运行的嵌入式软件也更加复杂。现代航空电子系统软件中大量引入了Linux操作系统,借助操作系统提供的服务提供更为丰富的业务功能,以满足客户不断提升的体验需求。
越来越复杂的航空电子软件系统也必然会引入更多的软件故障和错误,所以航空电子软件系统中提供必要的故障和错误定位排查手段是必须的。最常见的故障排查手段是运行日志、异常内存备份、以及软件在线调试工具。
对于航空电子软件开发、测试、运行过程中发生的某些故障,仅仅依靠运行日志提供的信息是难以定位解决的,而异常内存备份只能在应用程序崩溃的情况下才能使用,难以覆盖全部故障场景。在线调试工具作为二者的补充,能够在软件运行过程中实时监测程序运行状态,采样内存数据,在航空电子软件故障排查工作中是必不可少的。
航空电子系统上,对在线调试工具的主要功能需求包括:查看修改目标程序的内存空间、查看目标程序符号表信息、执行目标程序中指定函数、打印目标程序各个线程的调用栈、提供一个用户操作的界面。
在linux系统上应用最广泛的调试工具是开源的GDB,但是GDB依赖多种第三方库,如果所有依赖库全部导入航空电子软件系统,会导致其复杂度增加,占用更多资源(航空电子软件多是嵌入式软件,运行时能利用的资源有限,自身精简是非常必要的),也会增加航空电子软件适航认证的成本;此外GDB对目标程序的调试会导致目标程序“暂停”(所有线程停止执行,PC指针停留在当前位置,等待GDB发出的后续操作“命令”),对于某些需要目标程序持续运行的场景无法覆盖。
发明内容
本发明所要解决的技术问题是现有的应用于航空电子软件的linux系统上的调试工具依赖多种第三方库,如果所有依赖库全部导入航空电子软件系统,会导致其复杂度增加,占用更多资源,也会增加航空电子软件适航认证的成本;此外现有调试工具对目标程序的调试会导致目标程序“暂停”(所有线程停止执行,PC指针停留在当前位置,等待调试工具发出的后续操作“命令”),对于某些需要目标程序持续运行的场景无法覆盖。
考虑到航空电子软件多是嵌入式软件,运行时能利用的资源有限,自身精简是非常必要的,因此本发明提供了解决上述问题的一种应用于航空电子软件的轻量级调试工具的实现方法,提供一款没有外部依赖的,支持linux操作系统平台的,不会导致目标程序“暂停”的轻量级调试工具。
本发明通过下述技术方案实现:
一种应用于航空电子软件的轻量级调试工具的实现方法,调试工具包括提供用户操作界面的调试工具进程和嵌入目标进程(即被调试程序或目标程序)的调试线程,提供用户操作界面的调试工具进程和嵌入目标进程的调试线程之间通过socket通信;所述调试线程驻留在目标进程中,用于完成符号表解析、内存读写、堆栈分析和代码段执行;所有目标程序的stdout和stderr标准输出和标准异常输出均通过linux提供的dup系统调用接口重定向到socket句柄上,从socket传递到调试工具进程,所述调试工具进程收到数据后展示到操作控制界面上;包括以下步骤:
启动调试线程,调试线程启动完成后处于等待状态;
调试工具通过进程间socket向调试线程发送创建会话请求信息;
调试线程根据接收到的创建会话请求信息,初始化资源并创建调试会话线程;
调试会话创建成功后向调试工具返回响应,确认会话创建成功并返回会话的线程号,随后调试会话处于等待状态,监听socket端口,等待响应来自调试工具的命令,而此时调试线程等待调试会话线程返回;
调试工具根据控制界面输入(即用户输入)的命令将命令通过socket发送至调试会话线程;调试会话线程从socket读出命令后,根据命令的内容执行命令(操作),将执行结果通过stdout或者stderr标准输出,并将所有输出打印到调试工具的控制台上;同时,调试回话线程执行完命令后并退出,清理回收资源后返回等待下一个调试请求。
其中,目标进程是目标程序(即被调试程序)在启动时生成的对应进程。
进一步地,所述启动调试线程具体包括:
101)在开始调试时,调试工具通过linux平台的kill系统调用向目标进程发送一个SIGUSR1信号;
102)目标进程收到信号后执行SIGUSR1对应的处理函数;
103)目标进程调用dlopen接口,将deb.so动态库装载到当前进程的内存空间中,并直接调用调试线程的启动函数,函数原型如下:
int32_t debug_thread_init(void)。
进一步地,启动调试线程后,解析当前进程的符号表,从而获得当前进程内存空间中各个全局变量、函数所在地址值;解析符号表具体包括:
201)打开/proc/xxx/exe文件,在linux系统中,该exe文件为elf格式文件,且elf格式文件中包含了完整的符号表信息;
202)查找elf格式文件的符号表字段的头信息,该字段中包括但不限于符号的类型、占据内存空间大小、执行虚拟地址信息,同时通过它找到符号表对应的字符串表的位置;
203)找到字符串表段,字符串表中包括各个符号对应的字符串名称;
204)解析上述两张表(即符号表和字符串表)建立一个符号的字符串名称和符号地址的映射关系表;
205)完成符号表解析,只包含静态符号的解析,动态库导入的符号表和变量不在此处解析,需要解析时直接调用dlsym函数接口查找动态符号地址。
进一步地,所述调试会话线程从socket读出命令后,根据命令的内容执行命令(操作),将执行结果通过stdout或者stderr标准输出,并将所有输出打印到调试工具的控制台上;所述执行命令包括函数调用,所述函数调用具体包括:
301)监听socket句柄,从中读取命令字符串;
302)解析命令字符串,从中解析出需要调用的函数符号和入参;
303)查找根据所述解析符号表生成的符号和地址映射表,从中找出符号对应的地址,如果是动态库的符号,则调用dlsym函数查询其地址;
304)将步骤303)查询出的符号地址强行转换为void*(*func)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*);类型的函数指针,并调用该函数,将解析出的入参传递进去;
305)函数的输出结果通过printf打印输出到stdin中去,从而显示到调试工具控制界面上。
进一步地,所述将执行结果通过stdout或者stderr标准输出,并将所有输出打印到调试工具的控制台上;具体地,在调试工具控制台界面输出指定命令showstack后,打印所有目标线程的调用栈,具体实现机制如下:
401)调试线程启动过程中,调用sigaction接口挂接SIGSUR2和线程栈打印函数,使得目标进程中任意线程在收到SIGSUR2信号后都会调用线程栈打印函数;
402)线程栈打印函数利用了linux平台提供的backtrace函数,该函数返回当前线程调用栈的深度和所有调用栈上函数的指针,通过查询所述解析符号表生成的符号表,获得这些函数指针具体指向的函数,从而打印出调用栈;
403)在调试工具侧,输入showstack命令并回车,程序查找/proc/xxx/task目录下所有的子文件夹,在linux系统中该目录下子文件夹的名称为目标进程中各个线程的线程号,其中xxx为目标进程的进程号;
404)获取到目标进程中各个线程号后,调用sigqueue向各个线程发送SIGSUR2信号,从而触发调用栈打印函数,输出调用栈信息。
进一步地,所述调试工具根据控制界面输入(即用户输入)的命令将命令通过socket发送至调试会话线程;其中,调试工具程序运行后提供一个类shell的控制界面,工具使用者在控制界面上输入命令,调试输出也同样输出到控制界面上;包括:
501)初始化,首先通过tcgetattr接口获取当前进程的默认标准输入输出配置并保存备份(退出后用于恢复默认设置),禁用标准输入输出模式、禁用回显、每次读入一个字符进行一次停顿和解析;
502)循环调用getchar函数,从stdin逐个字符(即一个字符一个字符)的读入信息;如果是普通字符,将其存入缓冲区并回显到屏幕上;如果遇到\t、\b、\e等控制字符,则根据需要修改缓冲区内容、调整回显输出;
503)在检测到回车'\r'后从缓冲区读出用户录入的命令,解析命令,根据命令执行具体的操作或将命令通过socket发送给调试会话线程;
504)命令行界面创建了链表,用于缓存进10次录入的命令,当检测到‘[A’和‘[B’等命令组合的时候,从链表中读出上一条,下一条命令并更新当前缓冲区中的命令;
505)在检测到‘\t’字符时候,即tab键,将缓冲区已经录入的字符串发往调试线程,调试线程会将所匹配的符号名称返回并显示到命令行界面中,如果只有一个匹配,则用这个符号的字符串替换缓冲区的内容;
506)回显中光标左移并删除一个字符用输出‘\b\b’字符串实现;光标上移用’\e[A’字符串实现;光标下移用输出’\e[B’字符串实现;光标左移用输出’\e[D’字符串实现;光标右移用输出’\e[C’字符串实现。
本发明与现有技术相比,具有如下的优点和有益效果:
1、本发明方法简单、合理,通过在目标进程中嵌入调试线程,且调试线程驻留在目标进程的内存空间中来完成代码段访问、内存读写、堆栈分析等工作,调试线程配合调试工具在Linux操作系统平台上具备目标程序内存查看修改、函数调用、调用栈分解析、符号表解析的轻量级在线调试工具的实现;本发明有效解决了航空电子软件的linux系统上的现有调试工具导致其复杂度增加,占用更多资源,增加航空电子软件适航认证的成本,导致目标程序“暂停”的问题;
2、本发明提供一款没有外部依赖的,支持linux操作系统平台的,不会导致目标程序“暂停”的轻量级调试工具;尤其适用于机载嵌入式软件技术领域。
附图说明
此处所说明的附图用来提供对本发明实施例的进一步理解,构成本申请的一部分,并不构成对本发明实施例的限定。在附图中:
图1为本发明总体框架图。
图2为本发明一种应用于航空电子软件的轻量级调试工具的实现方法流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步的详细说明,本发明的示意性实施方式及其说明仅用于解释本发明,并不作为对本发明的限定。
实施例
如图1所示,本发明一种应用于航空电子软件的轻量级调试工具的实现方法,调试工具包括提供用户操作界面的调试工具进程和嵌入目标进程(即被调试程序或目标程序)的调试线程,提供用户操作界面的调试工具进程和嵌入目标进程的调试线程之间通过socket通信;所述调试线程驻留在目标进程中,用于完成符号表解析、内存读写、堆栈分析和代码段执行等;所有目标程序的stdout和stderr标准输出和标准异常输出均通过linux提供的dup系统调用接口重定向到socket句柄上,从socket传递到调试工具进程,所述调试工具进程收到数据后展示到操作控制界面上;如图2所示,包括以下步骤:
启动调试线程,调试线程启动完成后处于等待状态;
deb_tool调试工具通过进程间socket向调试线程发送创建会话请求信息;
调试线程根据接收到的创建会话请求信息,初始化资源并调用pthread_create创建调试会话线程;
调试会话创建成功后向deb_tool调试工具返回响应,确认会话创建成功并返回会话的线程号,随后调试会话处于等待状态,监听socket端口,等待响应来自deb_tool调试工具的命令,而此时调试线程调用pthread_join接口等待调试会话线程返回;
deb_tool调试工具根据控制界面输入(即用户输入)的命令将命令通过socket发送至调试会话线程;调试会话线程从socket读出命令后,根据命令的内容执行命令(操作),将执行结果通过stdout或者stderr标准输出,因为事先已经将它们重定向到了socket的句柄,因此将所有输出打印到调试工具的控制台上;同时,调试回话线程执行完命令后并退出,清理回收资源后返回等待下一个调试请求。
其中,目标进程是目标程序在启动时生成的对应进程。
部署实施:在线调试工具提供一个静态库deb.lib和动态库deb.so以及一个可执行程序deb_tool。对于调试工具的使用者而言,需要首先在自己的程序中链接deb.lib静态库文件,生成可执行的目标程序;然后,在Linux环境中,将deb.so放在目标程序同一目录下;最后在目标程序运在Linux系统中正常运行后,运行deb_tool工具,并将目标程序进程号作为入参传入deb_tool工具,命令如下,其中XXXXX表示目标程序的进程号:
[root@centosvm~]#./deb_tool XXXXX
完成上面操作后即可进入调试工具的命令行操作界面,开始调试工作。
具体地,调试线程驻留在目标程序的内存空间中,完成符号表解析、内存查询、堆栈分析、代码执行等具体的操作,所有完成相关操作的函数链接生成一个deb.so库中。所述启动调试线程具体包括:
101)在开始调试时,调试工具deb_tool通过linux平台的kill系统调用向目标进程发送一个SIGUSR1信号;
102)目标进程收到信号后执行SIGUSR1对应的处理函数(这些处理函数封装在deb.lib静态库中,已经链接到目标程序中);
103)目标进程调用dlopen接口,将deb.so动态库装载到当前进程的内存空间中,并直接调用调试线程的启动函数,函数原型如下:
int32_t debug_thread_init(void);
具体地,启动调试线程后第一个工作是解析当前进程的符号表,从而获得当前进程内存空间中各个全局变量、函数所在地址值;解析符号表具体包括:
201)打开/proc/xxx/exe文件,在linux系统中,所有用户态可执行程序都是elf格式文件,elf格式文件中包含了完整的符号表信息(前提是在生成elf文件时候不能将符号表信息全部去掉),这些信息在程序运行时保存在/proc/xxx/exe文件中,其中xxx表示目标进程的进程号;
202)查找elf格式文件的符号表字段的头信息,该字段中包括但不限于符号的类型、占据内存空间大小、执行虚拟地址信息,同时通过它找到符号表对应的字符串表的位置;
203)找到字符串表段,字符串表中包括各个符号对应的字符串名称;比如函数名称,全局变量名称;
204)解析上述两张表(即符号表和字符串表)建立一个符号的字符串名称和符号地址的映射关系表;
205)完成符号表解析工作,只包含静态符号的解析,动态库导入的符号表和变量不在此处解析,需要解析时直接调用dlsym函数接口查找动态符号地址。
具体地,所述调试会话线程从socket读出命令后,根据命令的内容执行命令(操作),将执行结果通过stdout或者stderr标准输出,并将所有输出打印到调试工具的控制台上;所述执行命令包括函数调用,调试工具动态库deb.so中包含了从socket接口字符串命令并解析、执行命令的函数cli_run_command,该函数负责在目标进程内通过调试会话调用命令指定的函数,所述函数调用具体包括:
301)监听socket句柄,从中读取命令字符串;
302)解析命令字符串,从中解析出需要调用的函数符号和入参;
303)查找根据所述解析符号表生成的符号和地址映射表,从中找出符号对应的地址,如果是动态库的符号,则调用dlsym函数查询其地址;
304)将步骤303)查询出的符号地址强行转换为void*(*func)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*);类型的函数指针,并调用该函数,将解析出的入参传递进去;
305)函数的输出结果通过printf打印输出到stdin中去,从而显示到调试工具控制界面上。
具体地,在调试工具控制台界面输出指定命令showstack后,打印所有目标线程的调用栈,具体实现机制如下:
401)调试线程启动过程中,调用sigaction接口挂接SIGSUR2和线程栈打印函数,使得目标进程中任意线程在收到SIGSUR2信号后都会调用线程栈打印函数;
402)线程栈打印函数利用了linux平台提供的backtrace函数,该函数返回当前线程调用栈的深度和所有调用栈上函数的指针,通过查询所述解析符号表生成的符号表,获得这些函数指针具体指向的函数,从而打印出调用栈;
403)在调试工具deb_tool侧,输入showstack命令并回车,程序查找/proc/xxx/task目录下所有的子文件夹,在linux系统中该目录下子文件夹的名称为目标进程中各个线程的线程号,其中xxx为目标进程的进程号;
404)获取到目标进程中各个线程号后,调用sigqueue向各个线程发送SIGSUR2信号,从而触发调用栈打印函数,输出调用栈信息。
具体地,deb_tool调试工具程序运行后提供一个类shell的控制界面,工具使用者在控制界面上输入命令,调试输出也同样输出到控制界面上;控制界面执行的操作包括:
501)初始化,首先通过tcgetattr接口获取当前进程的默认标准输入输出配置并保存备份(退出后用于恢复默认设置),禁用标准输入输出模式、禁用回显、每次读入一个字符进行一次停顿和解析;
502)循环调用getchar函数,从stdin逐个字符(即一个字符一个字符)的读入信息;如果是普通字符,将其存入缓冲区并回显到屏幕上;如果遇到\t、\b、\e等控制字符,则根据需要修改缓冲区内容、调整回显输出;
503)在检测到回车'\r'后从缓冲区读出用户录入的命令,解析命令,根据命令执行具体的操作或将命令通过socket发送给调试会话线程;
504)命令行界面创建了链表,用于缓存进10次录入的命令,当检测到‘[A’和‘[B’等命令组合的时候,从链表中读出上一条,下一条命令并更新当前缓冲区中的命令;
505)在检测到‘\t’字符时候,即tab键,将缓冲区已经录入的字符串发往调试线程,调试线程会将所匹配的符号名称返回并显示到命令行界面中,如果只有一个匹配,则用这个符号的字符串替换缓冲区的内容;
506)回显中光标左移并删除一个字符用输出‘\b\b’字符串实现;光标上移用’\e[A’字符串实现;光标下移用输出’\e[B’字符串实现;光标左移用输出’\e[D’字符串实现;光标右移用输出’\e[C’字符串实现。
工作原理如下:
基于现有的应用于航空电子软件的linux系统上的调试工具依赖多种第三方库,如果所有依赖库全部导入航空电子软件系统,会导致其复杂度增加,占用更多资源,也会增加航空电子软件适航认证的成本;此外现有调试工具对目标程序的调试会导致目标程序“暂停”(所有线程停止执行,PC指针停留在当前位置,等待调试工具发出的后续操作“命令”),对于某些需要目标程序持续运行的场景无法覆盖。
考虑到航空电子软件多是嵌入式软件,运行时能利用的资源有限,自身精简是非常必要的,因此本发明提供了解决上述问题的一种应用于航空电子软件的轻量级调试工具的实现方法,提供一款没有外部依赖的,支持linux操作系统平台的,不会导致目标程序“暂停”的轻量级调试工具;实施步骤为,首先,启动调试线程,调试线程启动完成后处于等待状态;其次,deb_tool调试工具通过进程间socket向调试线程发送创建会话请求信息;调试线程根据接收到的创建会话请求信息,初始化资源并调用pthread_create创建调试会话线程;调试会话创建成功后向deb_tool调试工具返回响应,确认会话创建成功并返回会话的线程号,随后调试会话处于等待状态,监听socket端口,等待响应来自deb_tool调试工具的命令,而此时调试线程调用pthread_join接口等待调试会话线程返回;然后,deb_tool调试工具根据控制界面输入(即用户输入)的命令将命令通过socket发送至调试会话线程;最后,调试会话线程从socket读出命令后,根据命令的内容执行命令(操作),将执行结果通过stdout或者stderr标准输出,因为事先已经将它们重定向到了socket的句柄,因此将所有输出打印到调试工具的控制台上。
本发明方法简单、合理,通过在目标进程中嵌入调试线程,且调试线程驻留在目标进程的内存空间中来完成代码段访问、内存读写、堆栈分析等工作,调试线程配合调试工具在Linux操作系统平台上具备目标程序内存查看修改、函数调用、调用栈分解析、符号表解析的轻量级在线调试工具的实现;本发明有效解决了航空电子软件的linux系统上的现有调试工具导致其复杂度增加,占用更多资源,增加航空电子软件适航认证的成本,导致目标程序“暂停”的问题。
本发明方法尤其适用于机载嵌入式软件技术领域,提供了一种轻量级调试工具的实现方法。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (2)

1.一种应用于航空电子软件的轻量级调试工具的实现方法,其特征在于,调试工具包括提供用户操作界面的调试工具进程和嵌入目标进程的调试线程,提供用户操作界面的调试工具进程和嵌入目标进程的调试线程之间通过socket通信;所述调试线程驻留在目标进程中,用于完成符号表解析、内存读写、堆栈分析和代码段执行;所有目标程序的标准输出和标准异常输出均通过linux提供的dup系统调用接口重定向到socket句柄上,从socket传递到调试工具进程,所述调试工具进程收到数据后展示到操作控制界面上;包括以下步骤:
启动调试线程,调试线程启动完成后处于等待状态;
调试工具通过进程间socket向调试线程发送创建会话请求信息;
调试线程根据接收到的创建会话请求信息,初始化资源并创建调试会话线程;
调试会话创建成功后向调试工具返回响应,确认会话创建成功并返回会话的线程号,随后调试会话处于等待状态,监听socket端口,等待响应来自调试工具的命令,而此时调试线程等待调试会话线程返回;
调试工具根据控制界面输入的命令将命令通过socket发送至调试会话线程;调试会话线程从socket读出命令后,根据命令的内容执行命令,将执行结果通过标准输出,并将所有输出打印到调试工具的控制台上;
启动调试线程后,解析当前进程的符号表,从而获得当前进程内存空间中各个全局变量、函数所在地址值;解析符号表具体包括:
201)打开/proc/xxx/exe文件,在linux系统中,该exe文件为elf格式文件,且elf格式文件中包含了完整的符号表信息;
202)查找elf格式文件的符号表字段的头信息,该字段中包括但不限于符号的类型、占据内存空间大小、执行虚拟地址信息,同时通过它找到符号表对应的字符串表的位置;
203)找到字符串表段,字符串表中包括各个符号对应的字符串名称;
204)解析上述两张表建立一个符号的字符串名称和符号地址的映射关系表;
205)完成符号表解析,只包含静态符号的解析,动态库导入的符号表和变量不在此处解析,需要解析时直接调用dlsym函数接口查找动态符号地址;
所述调试会话线程从socket读出命令后,根据命令的内容执行命令,将执行结果通过标准输出,并将所有输出打印到调试工具的控制台上;所述执行命令包括函数调用,所述函数调用具体包括:
301)监听socket句柄,从中读取命令字符串;
302)解析命令字符串,从中解析出需要调用的函数符号和入参;
303)查找根据所述解析符号表生成的符号和地址映射表,从中找出符号对应的地址,如果是动态库的符号,则调用dlsym函数查询其地址;
304)将步骤303)查询出的符号地址强行转换为void*(*func)(void*,void*,void*,void*,void*,void*,void*,void*,void*,void*);类型的函数指针,并调用该函数,将解析出的入参传递进去;
305)函数的输出结果通过printf打印输出到stdin中去,从而显示到调试工具控制界面上;
所述将执行结果通过标准输出,并将所有输出打印到调试工具的控制台上;具体地,在调试工具控制台界面输出指定命令showstack后,打印所有目标线程的调用栈,具体实现机制如下:
401)调试线程启动过程中,调用sigaction接口挂接SIGSUR2和线程栈打印函数,使得目标进程中任意线程在收到SIGSUR2信号后都会调用线程栈打印函数;
402)线程栈打印函数利用了linux平台提供的backtrace函数,该函数返回当前线程调用栈的深度和所有调用栈上函数的指针,通过查询所述解析符号表生成的符号表,获得这些函数指针具体指向的函数,从而打印出调用栈;
403)在调试工具侧,输入showstack命令并回车,程序查找/proc/xxx/task目录下所有的子文件夹,在linux系统中该目录下子文件夹的名称为目标进程中各个线程的线程号,其中xxx为目标进程的进程号;
404)获取到目标进程中各个线程号后,调用sigqueue向各个线程发送SIGSUR2信号,从而触发调用栈打印函数,输出调用栈信息;
所述调试工具根据控制界面输入的命令将命令通过socket发送至调试会话线程;其中,调试工具程序运行后提供一个类shell的控制界面,工具使用者在控制界面上输入命令,调试输出也同样输出到控制界面上;具体包括:
501)初始化,首先通过tcgetattr接口获取当前进程的默认标准输入输出配置并保存备份,禁用标准输入输出模式、禁用回显、每次读入一个字符进行一次停顿和解析;
502)循环调用getchar函数,从stdin逐个字符的读入信息;如果是普通字符,将其存入缓冲区并回显到屏幕上;如果遇到\t、\b、\e等控制字符,则根据需要修改缓冲区内容、调整回显输出;
503)在检测到回车'\r'后从缓冲区读出用户录入的命令,解析命令,根据命令执行具体的操作或将命令通过socket发送给调试会话线程;
504)命令行界面创建了链表,用于缓存进10次录入的命令,当检测到‘[A’和‘[B’等命令组合的时候,从链表中读出上一条,下一条命令并更新当前缓冲区中的命令;
505)在检测到‘\t’字符时候,即tab键,将缓冲区已经录入的字符串发往调试线程,调试线程会将所匹配的符号名称返回并显示到命令行界面中,如果只有一个匹配,则用这个符号的字符串替换缓冲区的内容;
506)回显中光标左移并删除一个字符用输出‘\b\b’字符串实现;光标上移用’\e[A’字符串实现;光标下移用输出’\e[B’字符串实现;光标左移用输出’\e[D’字符串实现;光标右移用输出’\e[C’字符串实现。
2.根据权利要求1所述的一种应用于航空电子软件的轻量级调试工具的实现方法,其特征在于,所述启动调试线程具体包括:
101)在开始调试时,调试工具通过linux平台的kill系统调用向目标进程发送一个SIGUSR1信号;
102)目标进程收到信号后执行SIGUSR1对应的处理函数;
103)目标进程调用dlopen接口,将deb.so动态库装载到当前进程的内存空间中,并直接调用调试线程的启动函数,函数原型如下:
int32_t debug_thread_init(void)。
CN202010429409.0A 2020-05-20 2020-05-20 一种应用于航空电子软件的轻量级调试工具的实现方法 Active CN111611161B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010429409.0A CN111611161B (zh) 2020-05-20 2020-05-20 一种应用于航空电子软件的轻量级调试工具的实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010429409.0A CN111611161B (zh) 2020-05-20 2020-05-20 一种应用于航空电子软件的轻量级调试工具的实现方法

Publications (2)

Publication Number Publication Date
CN111611161A CN111611161A (zh) 2020-09-01
CN111611161B true CN111611161B (zh) 2023-08-08

Family

ID=72200353

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010429409.0A Active CN111611161B (zh) 2020-05-20 2020-05-20 一种应用于航空电子软件的轻量级调试工具的实现方法

Country Status (1)

Country Link
CN (1) CN111611161B (zh)

Citations (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101251799A (zh) * 2008-04-16 2008-08-27 中兴通讯股份有限公司 管理实现的方法和装置
CN101446918A (zh) * 2008-12-10 2009-06-03 中兴通讯股份有限公司 一种实现用户态调试器调试单个函数的方法及系统
JP2010287101A (ja) * 2009-06-12 2010-12-24 Oki Semiconductor Co Ltd ソフトウエアデバッグ装置及び方法
CN102004692A (zh) * 2010-11-25 2011-04-06 中兴通讯股份有限公司 进程调试方法及装置
WO2012069883A1 (en) * 2010-11-25 2012-05-31 Freescale Semiconductor, Inc. Method of debugging software and corresponding computer program product
CN103324569A (zh) * 2013-06-08 2013-09-25 四川长虹电器股份有限公司 嵌入式系统应用程序代码的测试方法
CN103595820A (zh) * 2013-11-28 2014-02-19 深圳英飞拓科技股份有限公司 嵌入式前端设备后台控制调试方法及装置
US8683444B1 (en) * 2006-12-11 2014-03-25 Synopsys, Inc. System and method of debugging multi-threaded processes
CN103729288A (zh) * 2013-11-01 2014-04-16 华中科技大学 一种嵌入式多核环境下应用程序的调试方法
CN104679631A (zh) * 2015-03-23 2015-06-03 重庆蓝岸通讯技术有限公司 用于基于Android系统的设备的测试方法及系统
WO2016061820A1 (en) * 2014-10-24 2016-04-28 Google Inc. Methods and systems for automated tagging based on software execution traces
CN107451054A (zh) * 2017-07-26 2017-12-08 武汉虹信通信技术有限责任公司 一种用于linux环境中的内存池调试方法

Patent Citations (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8683444B1 (en) * 2006-12-11 2014-03-25 Synopsys, Inc. System and method of debugging multi-threaded processes
CN101251799A (zh) * 2008-04-16 2008-08-27 中兴通讯股份有限公司 管理实现的方法和装置
CN101446918A (zh) * 2008-12-10 2009-06-03 中兴通讯股份有限公司 一种实现用户态调试器调试单个函数的方法及系统
JP2010287101A (ja) * 2009-06-12 2010-12-24 Oki Semiconductor Co Ltd ソフトウエアデバッグ装置及び方法
CN102004692A (zh) * 2010-11-25 2011-04-06 中兴通讯股份有限公司 进程调试方法及装置
WO2012069883A1 (en) * 2010-11-25 2012-05-31 Freescale Semiconductor, Inc. Method of debugging software and corresponding computer program product
CN103324569A (zh) * 2013-06-08 2013-09-25 四川长虹电器股份有限公司 嵌入式系统应用程序代码的测试方法
CN103729288A (zh) * 2013-11-01 2014-04-16 华中科技大学 一种嵌入式多核环境下应用程序的调试方法
CN103595820A (zh) * 2013-11-28 2014-02-19 深圳英飞拓科技股份有限公司 嵌入式前端设备后台控制调试方法及装置
WO2016061820A1 (en) * 2014-10-24 2016-04-28 Google Inc. Methods and systems for automated tagging based on software execution traces
CN104679631A (zh) * 2015-03-23 2015-06-03 重庆蓝岸通讯技术有限公司 用于基于Android系统的设备的测试方法及系统
CN107451054A (zh) * 2017-07-26 2017-12-08 武汉虹信通信技术有限责任公司 一种用于linux环境中的内存池调试方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于模拟器远程调试系统的研究与实现;于婷 等;《微计算机信息》(第02期);4-6 *

Also Published As

Publication number Publication date
CN111611161A (zh) 2020-09-01

Similar Documents

Publication Publication Date Title
CN109783342B (zh) 脚本调试方法、设备及计算机存储介质
CN111026645B (zh) 用户界面自动化测试方法、装置、存储介质及电子设备
US8806438B2 (en) Collaborative software debugging in a distributed system with variable-specific messages
US20120278790A1 (en) Collaborative Software Debugging In A Distributed System With Real-Time Variable Modification Indicators
US20030208746A1 (en) Conditional breakpoint encountered indication
CN109815119B (zh) 一种app链接渠道的测试方法及装置
US20120117542A1 (en) Collaborative Software Debugging In A Distributed System With Client-Specific Event Alerts
CN111752843A (zh) 用于确定影响面的方法、装置、电子设备及可读存储介质
KR102488582B1 (ko) 애플리케이션 실행 상태 검증 방법 및 장치
CN108829591B (zh) 一种基于Web的协同调试系统及方法
CN112115038A (zh) 一种应用测试方法、装置和存储介质
CN113051514A (zh) 元素的定位方法、装置、电子设备及存储介质
CN113722020A (zh) 接口调用方法、装置和计算机可读存储介质
CN110688313A (zh) 一种VxWorks操作系统下软件测试的故障注入方法
CN110704315B (zh) 一种嵌入式软件测试的故障注入装置
CN113127329B (zh) 脚本调试方法、装置及计算机存储介质
CN111611161B (zh) 一种应用于航空电子软件的轻量级调试工具的实现方法
CN103176903B (zh) MapReduce分布式系统程序的测试方法及设备
US6993749B2 (en) Conditional debug monitors
CN110888641A (zh) 一种脚本自动生成方法、装置、服务器及存储介质
US6983454B2 (en) Extended “run to” function
CN110096281B (zh) 代码解析方法、解析服务器、存储介质及装置
JP2001243089A (ja) ソフトウェア検証装置及びソフトウェア検証方法
CN113761402A (zh) 一种链接调试方法、装置、设备和存储介质
CN113760696A (zh) 一种程序问题定位方法、装置、电子设备和存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant