近日,调试一个带有复杂数据接口的程序,顺便了解了以下gdb的自定义函数,以下以打印一个链表为例子,说明一下gdb如何使用gdb的自定义函数
测试代码(test.c)如下
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct node{
- int val;
- struct node * next;
- }node_list_t;
- typedef node_list_t* pnode_list_t;
- typedef node_list_t** ppnode_list_t;
- void create_list( ppnode_list_t ppnode);
- void destroy_list( ppnode_list_t ppnode);
- int main( int argc, char **argv ){
- pnode_list_t list=NULL;
-
- create_list(&list);
- destroy_list(&list);
- return 0;
- }
- void create_list( ppnode_list_t ppnode){
- int count=10;
- pnode_list_t temp=NULL;
- while(count){
- temp=(pnode_list_t)malloc(sizeof(node_list_t));
- if(temp){
- temp->val=count;
- temp->next=*ppnode;
- *ppnode=temp;
- }
- --count;
- }
- }
- void destroy_list( ppnode_list_t ppnode){
- pnode_list_t temp=NULL;
- if(!ppnode){
- return;
- }
- while(*ppnode){
- temp=*ppnode;
- *ppnode=(*ppnode)->next;
- free(temp);
- temp=NULL;
- }
- }
在~/.gdbinit下加入如下代码(如果没有此文件,需要手工建立):
- define print_list
- set $list=$arg0
- while($list)
- printf "%d\t",$list->val
- set $list=$list->next
- end
- printf "\n"
- end
以上代码定义了一个gdb的自定义函数:print_list,后续调试的时候会用到
编译源代码test.c
在源代码21行的destroy_list处下断点,然后运行
程序运行之后,断点处停住,调用自定义函数print_list,有如下输出:
- (gdb) print_list list
- 1 2 3 4 5 6 7 8 9 10
- (gdb)
阅读(2761) | 评论(0) | 转发(0) |