作为一个写C/C++的程序员,内存问题总是一个大问题,与堆栈打交道总是避免不了的,而且你也要坚信一件事情,你代码风格如何好,你总会犯错,但是编译器帮不了你的时候,如果有别的工具能在这些事情上帮助你总是很好的。我相信,调试内存泄漏、堆栈被破坏之类的问题,对大家来说一定不是一个好的回忆。所以尽可能地使用一些工具是很好的做法。可以说一下,valgrind更出名,而且功能也很强大,但问题是,valgrind编译出来之后我发现实在太大了,主要的东西得有一百多M,当然在PC端或者一些资源丰富一点的硬件板上是没问题的,但是我用的板子实在比较弱小,这个时候libcsdbg帮到你!
简单介绍一下,这个是一个开源库,主要功能如下:
复杂的异常堆栈跟踪(支持 addr2line)
POSIX 线程堆栈跟踪详情(支持 addr2line)
完全支持 Position Independent Code (for DSO)
最简单以及最小化的代码接口,透明的库集成
简单的库运行配置
最小的额外开销
支持通用 throwables 和用户自定义异常类型
支持各种目标对象格式(elf, a.out, coff, ecoff e.t.c)
支持各种文件格式(programs/libraries, archives, core dumps)
支持 32/64 位系统
支持 big 和 little endian CPUs
提供 x86, x86_64, ARM 7/9/11/thumb, Leon 2/3, AVR32, MIPS 编译版本
功能介绍完毕,开始说该怎么用起来了。
1. 首先要下载啊
http://sourceforge.net/projects/libcsdbg/
这个链接里就是最新版了,当然也可以下一些旧一点的版本,我就是这样的,只是下了1.27,因为1.28一开始编不过,不肯定什么问题,然后发现1.27也一样,才发现,原来自己恶心的工具链的问题。
2. 编译
既然要用起来,那首先就得编译成,虽然感觉难度不大,还是需要搞一下。解压那些不说了啊,就把里面的makefile里的PLATFORM改成自己编译器对应的前缀,否则就是用系统的GCC编译了。执行的时候用./build,不是直接make的,要注意一下,其他的都没什么了。至于工具链的问题我就不详细说了,有问题也可以提出来大家探讨,我说一下我用的GCC,唉,居然对应的binutil没有bfd所有的东西,然后我就无语了。没有bfd.h啊,肯定编不过了,然后我从别的地方拖了一个进来,还有一些系统枚举值不支持啊之类的,只能自己改改代码了,最后好不容易编过了。一切的起因就是因为我的编译器用的东西比较老?谁叫linux喜欢不向下兼容呢。我直接什么都不改,sudo ./build完全没问题啊,提醒一下,如果真的给自己PC端程序用,或类似的情况下最好就用超级用户去做,或者某些比较通用的linux都支持的sudo。其他编译的问题可以./build -h查看。
编译顺利的话,可以在编译目录下的lib目录中找到你想要的libcsdbg.so,提醒一下,这是一个软连接,至于链到哪很明显的。
3. 编译自己的程序,并链接
得到了so之后就是链接到自己的程序里了。理论上链接一个so是很简单的,但是,问题是,刚刚说到的,它需要用到bfd(一个正常的binutil里面会编译出一个libbfd.so的,顺便告诉你,bfd是一个库),所以很明显,链接选项至少是-lbfd -lcsdbg。又要说一个很恶心的东西,由于我的工具链没有bfd相关的所有,所以很明显,libbfd.so这个库也是没有的,不要气馁,没用的,哭去吧。然后我的做法是自己编译一下binutil啊,有其他办法吗?编译一个binutil给自己用啊,就为了它的libbfd.so,顺带的你也得到了bfd.h了。以上的纯粹是个人用的编译器恶心的问题,还是直接给出需要的。
链接选项加上:-lcsdbg -ldl -lbfd -lpthread
编译选项加上:
CFLAGS += -g
CFLAGS += -finstrument-functions
CFLAGS += -finstrument-functions-exclude-file-list=/opt/hisi-linux-nptl/arm-hisiv100-linux/include
CFLAGS += -finstrument-functions-exclude-file-list=iostream
CFLAGS += -finstrument-functions-exclude-file-list=ios
CFLAGS += -finstrument-functions-exclude-file-list=istream
CFLAGS += -finstrument-functions-exclude-file-list=ostream
CFLAGS += -finstrument-functions-exclude-file-list=../../csdbg/include/csdbg
-finstrument-functions这是一个多么美好的选项,可以记录调用过的函数,-finstrument-functions-exclude-file-list这个选项就是去掉哪些不需要记录的文件,那样的话可以去掉一些你不需要调试的函数,尤其系统的你当然不需要去关心了,出错最多的都是你自己!关于这个gcc选项的介绍推荐看这个blog:
http://blog.csdn.net/hengshan/article/details/7869472
大概就这样能把你的程序和libcsdbg链接起来了。
我的版本是,最后都成功编译过了链接过了,一跑就立马段错误,不链这个库却没问题,放弃了,理论上这个库使用起来是很简单的,而且功能足够好,自己用的编译器缺了bfd,没办法。