使用strings工具判断软件版本与core dump文件的版本是否一致
来源:互联网 发布:理财软件对比分析 编辑:程序博客网 时间:2024/04/30 13:28
在Linux下开发程序时,经常会遇到内存访问错误而产生core dump文件。在使用gdb来debug时,需要保证软件版本与core dump文件的版本保持一致。但是在开发过程尤其是大型软件的开发过程中,由于版本的频繁发布以及开发和测试的分工,搞错版本是经常遇到的事。
本文介绍一种判断版本是否一致的简单方法。主要利用了strings工具提供的字符串提取功能。
(注:这个想法是从一位同事那了解到的,我只不过写了个程序和脚本验证了一下)
【主要思想】
在某个C文件中定义一个保存了版本信息的全局字符串变量,例如unsigned char version[] = "Version_V1R1C00"。这个全局变量只用于保存版本信息,并需要保证程序中不会存在类似的字符串(至少前几个字符不一样)。这样在软件版本和core dump文件中就会保存这个版本字符串信息。使用strings工具将这些信息提取出来并加以比较,就可以确定版本是否一致了。
注意:每发布一个版本,需要相应地修改这个全局变量。
【简要说明】
(1)Linux下的C程序常常会因为内存访问出错而造成segment fault等错误,如果此时系统的core dump功能是打开的,则会将程序运行出错时的内存映像存储到硬盘上,接着就可以使用gdb对core dump文件进行分析。
Linux系统默认不打开core dump功能,可以使用ulimit -c命令判断或打开core dump功能。
(2)strings工具
功能:打印文件中(如非文本文件)的可打印字符串。默认情况下,字符串至少需要包含4个字符,但可以通过-n选项配置字符串的最小长度。
用法:man strings或google一下
(3)脚本中使用printf进行格式化输出:脚本使用“ANSI非常规字符序列”来设置shell脚本输出的字体和颜色,如出错则打印信息为”红色“,结果正确则打印信息为”绿色“。
用法:见”设置shell脚本输出字体颜色“。链接为http://biancheng.dnbcw.info/shell/234763.html
【脚本文件】
VersionMatch.sh
#!/bin/sh# 判断输入是否正确if [ $# -ne 2 ]; then printf "\033[31merror: The right format is <SCRIPT_NAME SOFT_NAME CORE_NAME>\033[0m\n" exit 1fiif [ ! -f $1 ]; then printf "\033[31merror: $1 doesn't exist or is not a regular file.\033[0m\n" exit 1fiif [ ! -f $2 ]; then printf "\033[31merror: $2 doesn't exist or is not a regular file.\033[0m\n" exit 1fi# 获取版本信息SOFT_VER=$(strings $1 | grep Version)CORE_VER=$(strings $2 | grep Version)# 获取输入文件名的字符串长度LEN_SOFT=$(expr length $1)LEN_CORE=$(expr length $2)if [ $LEN_SOFT -ge $LEN_CORE ]; then LEN=$LEN_SOFTelse LEN=$LEN_COREfi# 格式化输出:保证对齐printf "%-$(($LEN))s: $SOFT_VER\n" $1printf "%-$(($LEN))s: $CORE_VER\n" $2# 比较版本信息if [ "$SOFT_VER" = "$CORE_VER" ]; then printf "\033[32mmatch!\033[0m\n"else printf "\033[31mWaring: not match!!!\033[0m\n"fiexit 0
【举例说明】
(1)定义一个C文件,主要代码如下。由于访问了非法地址,运行时会生成一个coredump文件。
#include <stdio.h>unsigned char version[] = "Version_V1R1C00";int main(){ int *a = NULL; int b = *a; return 0;}
(2)假设生成的软件为a.out,生成的core dump文件为core
在shell下执行或会看到输出结果为。(注:这里只是介绍一下strings的用法,与脚本无关)
(3)在shell下执行VersionMatch.sh,可看到如下结果:
如果将version的值改为"Version_V1R2C00",重新生成a.out,但不执行a.out,即不重新生成core。则执行结果如下:
【使用总结】
简单总结下使用方法:(1)定义一个全局变量保存版本信息;(2)将脚本中SOFT_VER=$(strings $1 | grep Version)和CORE_VER=$(strings $2 | grep Version)这两行的Version改为全局变量中前几个不会变化的字符。
- 使用strings工具判断软件版本与core dump文件的版本是否一致
- 判断用户是否第一次使用软件版本
- chrome与chromedriver 版本一致的问题
- linux下core dump文件的使用
- 版本管理 与 Subversion软件的使用
- 版本控制工具的使用与CodeReview
- 判断app该版本是否第一次使用
- Eclipse中设置与项目一致的java版本
- 判断dxf文件的版本
- iOS判断是否是最新的版本
- 使用JavaCPP Presets For OpenCV时一定要注意版本与本地OpenCV版本一致
- mysqlbinlog 与binlog要版本一致
- 查看dump文件导出的版本,时间,用户
- Linux使用笔记: 定制core dump文件的文件名
- SVN版本库的迁移 dump的详细使用
- 判断表格中行的值是否一致
- CVS版本控制软件的安装配置与使用
- CVS版本控制软件的安装配置与使用
- Android与PC的socket通信
- Linux内存管理之kmalloc 与 __get_free_page()
- 测试用例设计心得
- test1
- 初识Python
- 使用strings工具判断软件版本与core dump文件的版本是否一致
- 校验某个用户的某个组织是否存在某个权限项
- 从Oracle9i中发送电子邮件
- Android里实现基站和WIFI定位
- QT实现语言切换
- lunix系统的基本流程
- jquery form 和 validation 的整合
- C/C++:我应该把星号放在什么地方?
- 关于GUID