GDB attach 调试

50 篇文章 3 订阅
1 篇文章 0 订阅

手贱写个bug,索性看看gdb。


首先写个简单的多线程小程序用于测试:

#include <pthread.h>           
#include <stdio.h>             
#include <unistd.h>
void *function(void *p)        
{
        unsigned int count = 0;
        while(1)               
        {                      
                printf("In function: %d\n\n", count);
                sleep(1);      
                count++;       
#if 0
                if(count == 5) 
                {
                        int * a = NULL;
                        (*a)++;
                }
#endif
        }
}

#if 1
int main()
{
        pthread_t thread;
        pthread_create(&thread, NULL, function, NULL);
        //pthread_join(thread, NULL);   
        
        unsigned int main_count = 0;    
        while(1)
        {
                printf("In main: %d\n", main_count);
                sleep(1);
                main_count++;
        }
        printf("main return \n");       
        return 0;
}
#endif

基本的gdb操作不在此赘述,以下是attach 实录:

  • 在编译源码的时候切记加 -g 选项,否则 执行 list冒出个No symbol table is loaded

  • 编译完成后运行即可,执行./exe(exe是我重命名后的可执行程序)
    在这里插入图片描述

  • 执行ps -ef | grep exe获取 exe pid
    在这里插入图片描述

  • 执行gdb+attach 29708,其中29708是上图中exe的pid
    在这里插入图片描述

  • 左侧为exe运行输出,此时运行中断,等到attach 的 gdb 命令行给指令,比如我执行n,如下图

在这里插入图片描述

  • 可以尝试一些基本操作,如: 在这里插入图片描述
  • 我想实现两点:
    1. 打印count的值,这个很容易实现,利用p(单次打印) 或 display(多次打印) 均可实现。
    1. 希望程序一直运行,这个用到了command命令:
      在这里插入图片描述
      在11行设置一个断点,断点编号为5,执行command 5
      在这里插入图片描述
> p count		#打印 count 的值
> c				#continue
> end			#结束command的输入

此时执行info b可以看到,在断点5下多了两行命令。
执行c
在这里插入图片描述
此时程序就会在断点5处中断,执行p count,然后执行c直到下次触发中断。

不过,这样也不是我想要的,目前不知道什么原因,这样的实现方式只能执行9次,如下图
在这里插入图片描述
这只是减少了工作量,可还需要人为干预。之后又尝试了silent
在这里插入图片描述
实现效果:
在这里插入图片描述
依旧需要人为干预,难受。。。


先到这吧,后期有什么再补充。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值