gdb 自定义函数使用

2943阅读 0评论2012-11-12 C01141307
分类:C/C++

近日,调试一个带有复杂数据接口的程序,顺便了解了以下gdb的自定义函数,以下以打印一个链表为例子,说明一下gdb如何使用gdb的自定义函数

测试代码(test.c)如下

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct node{
  4.     int val;
  5.     struct node * next;
  6. }node_list_t;


  7. typedef node_list_t* pnode_list_t;
  8. typedef node_list_t** ppnode_list_t;

  9. void create_list( ppnode_list_t ppnode);
  10. void destroy_list( ppnode_list_t ppnode);

  11. int main( int argc, char **argv ){

  12.     pnode_list_t list=NULL;
  13.     
  14.     create_list(&list);
  15.     destroy_list(&list);

  16.     return 0;
  17. }


  18. void create_list( ppnode_list_t ppnode){
  19.     int count=10;
  20.     pnode_list_t temp=NULL;

  21.     while(count){
  22.         temp=(pnode_list_t)malloc(sizeof(node_list_t));
  23.         if(temp){
  24.             temp->val=count;
  25.             temp->next=*ppnode;
  26.             *ppnode=temp;
  27.         }

  28.         --count;
  29.     }
  30. }


  31. void destroy_list( ppnode_list_t ppnode){
  32.     pnode_list_t temp=NULL;

  33.     if(!ppnode){
  34.         return;
  35.     }

  36.     while(*ppnode){
  37.         temp=*ppnode;
  38.         *ppnode=(*ppnode)->next;

  39.         free(temp);
  40.         temp=NULL;
  41.     }
  42. }
在~/.gdbinit下加入如下代码(如果没有此文件,需要手工建立):

点击(此处)折叠或打开

  1. define print_list
  2. set $list=$arg0
  3. while($list)
  4. printf "%d\t",$list->val
  5. set $list=$list->next
  6. end
  7. printf "\n"
  8. end
以上代码定义了一个gdb的自定义函数:print_list,后续调试的时候会用到

编译源代码test.c

点击(此处)折叠或打开

  1. gcc -g -o test test.c
使用gdb调试test程序:

点击(此处)折叠或打开

  1. gdb ./test
在源代码21行的destroy_list处下断点,然后运行

点击(此处)折叠或打开

  1. (gdb) b 21
  2. (gdb) r
程序运行之后,断点处停住,调用自定义函数print_list,有如下输出:

点击(此处)折叠或打开

  1. (gdb) print_list list
  2. 1    2    3    4    5    6    7    8    9    10    
  3. (gdb)




上一篇:百度开源了RPC框架 BGCC
下一篇:gdb 自定义函数总结