首页 > 程序人生 > 介绍几个关于C/C++程序调试的函数

介绍几个关于C/C++程序调试的函数

最近调试程序学到的几个挺有用的函数,分享一下,希望对用C/C++的朋友有所帮助!

1. 调用栈系列
下面是函数原型:

1
2
3
4
#include "execinfo .h"
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);

接下来,对上面三个函数进行介绍:
(1)backtrace用来获得当前程序的调用栈,把结果存在buffer中。通常,我们用gdb调试程序,设置合适的断点,停下来之后,用backtrace(bt)命令,就可以看到当前的调用栈。但是,有的时候,用到条件断点的时候,gdb的功能就没有程序本身的强大了,这个时候,可以考虑在程序中调用backtrace函数,来获取调用栈。
(2)backtrace_symbols把用backtrace获取的调用栈转换成字符串数组,以字符串数组的形式返回,使用者需要在外面释放返回的字符串数组所占用的内存
(3)backtrace_symbols_fd把用backtrace获取的调用栈信息写到fd所指定的文件中

1
 void * __builtin_return_address (unsigned int level)

这个函数用来得到当前函数,或者调用它的函数的返回地址,得到这个地址后,通过gdb反汇编,便可得到调用函数相关的信息,这也是在应用中获取调用栈的一种方法。

2. 内存分配、释放系列

1
2
#include "malloc .h"
size_t malloc_usable_size((void *__ptr));

这个函数的用法是返回调用malloc后实际分配的可用内存的大小。我们都知道在C++中,operator new()可以重载各种各样的版本,可以传入调用时的相关信息来跟踪内存分配情况,但是operator delete()却只有两种形式,不能随意重载,尤其是全局的operator delete(),只有一种版本,这个时候就比较痛苦了,究竟释放了多少内存呢? 这时候malloc_usable_size()这个函数就有用武之地了,调用它便可以获取当前释放的内存的大小。这里需要注意的是,如果在delete中用了malloc_usable_size来计算释放的内存大小,那么在new中也请用它来统计开辟的内存,这样才能对应起来。因为在调用malloc时,很多时候实际分配的内存会比用户申请的要大一些,所以如果两边的统计方法对应不起来的话,统计结果也会有比较大的判别。
这里关于new/delete重载的一些细节我不做说明,之前我写过一篇文章的,不明白的朋友可以去看一下这篇文章《细说C++中的new与delete》。

分类: 程序人生 标签: , , , , ,
  1. 2010年5月7日09:53 | #1

    看到函数就头大

  2. 2010年5月7日10:38 | #2

    支持了 看见代码就感觉很爽 呵呵 不知不觉我也加入了代码狂人的行列了

  3. 2010年5月7日10:40 | #3

    c++ 不懂

  4. 2010年5月7日10:54 | #4

    很不错哦!
    NEW 和 DEILETE

    不过 我习惯了 malloc 和 free

  5. 2010年5月7日12:32 | #5

    @玉奇分享 C++中还是用new/delete吧~~ 纯C的话,用malloc/free

  6. 2010年5月7日12:33 | #6

    @空灵调调 什么时候狂人变达人就好了~

  7. 2010年5月7日13:33 | #7

    这个真不懂。。。

  8. 2010年5月7日13:58 | #8

    @老七 呵呵,术业有专攻而已~~

  9. 2010年5月8日10:58 | #9

    @小武哥
    术业有专攻 哈哈 很好 没想到小武哥还有古典风味 你很优秀~~~

  10. 2010年5月8日15:06 | #10

    @空灵调调 汗一个。

  11. 2010年5月9日13:59 | #11

    好厉害~

  12. 2010年5月9日23:31 | #12

    我也是看见这些东西就头很大~看不明白,学不会,唉,读书的时候专心点就好了。

  13. 2010年5月11日18:06 | #13

    哈哈,内容经典,拜读了,小站来过了,有空博主记得回访哦。

  1. 2011年6月11日23:06 | #1
您必须在 登录 后才能发布评论.