- 论坛徽章:
- 0
|
本帖最后由 sunlan 于 2010-04-02 16:14 编辑
很多程序员都遇到过这样的问题:已经上线运行很长时间的系统出了问题,并且其中的很多程序经过了多次的修改和升级,日志中的信息和现有的程序完全对不上号!怎样才能查看程序的信息(例如版本号、编译的时间等)、以确定程序的确切版本呢?很多的版本管理工具(例如CVS、SVN)可以帮你管理源码的版本,但并不会在编译的时候把编译信息写到二进制执行码中去。因此,还是要通过其他手段来实现。
在这里我提供了一种在可执行程序中写入编译信息的办法,希望对大家有帮助。
这个例子由两个程序构成:test.c、version.c。其中version.c用于实现编译信息的记录,只要在现有的代码中加入该程序,而不需要对已有代码作任何的修改,就能实现二进制执行码的版本信息管理。
version.c
- #include <stdio.h>
- /* 以下两个宏用于在编译时通过宏定义传入编译信息
- VERSION被替换为const char version[]=”Resivion: xxxx”
- BUILDTIME被替换为 const char buildtime[]=”Buildtime: yyyymmdd”
- */
- VERSION;
- BUILDTIME;
- void print_version()
- {
- printf( “%s\n”, version );
- }
- void print_buildtime()
- {
- printf( “%s\n”, buildtime );
- }
复制代码 print_version()和print_buildtime()这两个函数不是必须的,只是让version.c看起来“更象个程序”,同时可以提供在外部程序中输出编译信息的手段。
test.c
- #include <stdio.h>
- int main()
- {
- print_version();
- print_buildtime();
- }
复制代码 在test.c中调用这两个函数只是用于测试,正式版本的程序中可以用实际的代码替换。
在Makefile中添加以下的内容:
- version="const char version[]=\"Revision: 1.2.2\""
- buildtime="const char buildtime[]=\"Buildtime: `date +%Y%m%d`\""
- CFLAGS=-c –g –DVERSION=”$version” –DBUILDTIME=”$buildtime”
- testversion: test.o version.o
- cc –o $@ $?
- .c.o :
- $(CC) $(CFLAGS) $<
复制代码 如果你使用了版本管理工具,可以通过工具动态读取版本(或修订)信息,将信息赋值给version变量。你完全可以自己定义宏定义的格式,例如将编译的精确时间写进去。
编译后执行:
- $testversion
- Revision: 1.2.2
- Buildtime: 20100402
- $
复制代码 通过strings命令查看:
- $string testversion | grep Revision
- Revision: 1.2.2
- $strings testversion | grep Buildtime
- Buildtime: 20100402
复制代码 这个结果是我真正希望的!只要通过查看二进制执行码中的字符串,就可以确定程序的版本了! |
|