Linux:查看调试多进程和多线程调试和查看

Linux学习-目录


1.进程查看

eg:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>


int main()
{
    pid_t pid;
    pid = fork();

    if(pid < 0)
    {
        perror("fork\n");
        exit(-1);
    }
    else if(pid == 0)
    {
        int i = 5;
        while(i--)
        {
            printf("child is runing %d\n",i);
            sleep(1);
        }
        printf("child is dead\n");
    }
    else
    {

        int j = 4;
        while(j--)
        {
            printf("parent is runing %d\n",j);
            sleep(1);
        }
        printf("parent is dead\n");
    }

    return 0;
}

上面代码创建一个父进程和子进程,代码运行结果如下
这里写图片描述
那么怎么查看进程呢?

  • 方式一
    这里写图片描述
    其中10826为父进程id,10827为子进程id
ps aux | head -n1 
作用:打印显示所有包含其他使用者的进程,打印出第一行信息

ps:显示当前运行中进程的相关信息
a:与终端有关的进程
x:与终端无关的进程
u:与用户有关的进程

即:
这里写图片描述

ps aux | grep a.out
作用:打印显示所有包含其他使用者的进程,再利用一个管道符号导向到
grep去查找a.out进程

即:
这里写图片描述

  • 方式二

    这里写图片描述

ps -ef
-e : 在命令执行后显示环境  
-f : 完整显示输出

-ef 选项的 ps,返回系统中所有用户的所有进程的完整列表。
一般将此 ps 命令的结果通过管道传送到 grep 中

PPID为父进程id,其中可以看出10826为10827父进程id


  • 简单说一下如何杀死进程

1: kill -9 进程pid
eg:kill -9 10826 杀死父进程
2:ps -ef | grep firefox | awk ‘{print $2}’ | xargs kill -9 杀掉所有进程

其中awk ‘{print $2}’ 的作用就是打印(print)出第二列的内容。可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

2.进程调试

2.1:单进程调试

1:follow-fork-mode

gdb默认调试父进程,调试器选项如下:

set follow-fork-mode mode
(其中mode为可选值,parent和child,默认为父进程)

info inferiors              查询正在调试的进程
inferior processnum         切换进程 
2.1:多进程调试

2:detach-on-fork

follow-fork-mode  detach-on-fork   参数说明
parent  on      只调试主进程(GDB默认)
child   on      只调试子进程
parent  off     同时调试两个进程,gdb跟主进程,子进程block在fork位置
child   off     同时调试两个进程,gdb跟子进程,主进程block在fork位置

用法:
set follow-fork-mode [parent|child]   
set detach-on-fork [on|off]

调试过程:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

3.线程查看

这里写图片描述

//查看当前运行的轻量级进程
ps -aL

LWP:代表是轻量级进程

4.线程调试

4.1:进入gdb调试中

将进程附加到gdb调试器当中,查看是否创建了新线程:gdb attach 主线程ID
这里写图片描述

4.2:查看线程信息
1.查看进程:info inferiors
2.查看线程:info threads
3.查看线程栈结构:bt
4.切换线程:thread n(n代表第几个线程)

这里写图片描述

4.3:设置断点,并执行线程3的函数,指行完毕继续运行到断点处
 继续使某一线程运行:thread apply 1-n(第几个线程) n

这里写图片描述

4.4:只运行当前线程
1. 设置:set scheduler-locking on
2. 单步运行:n

这里写图片描述

4.5:所有线程同步执行

设置:set scheduler-locking off
这里写图片描述

5:总结命令
指令含义
set follow-fork-mode mode单进程调试其中mode为可选值,parent和child,默认为父进程)
set follow-fork-mode [parent/child]多进程调试
info inferiors查询正在调试的进程
inferior processnum切换进程
info threads查看线程
bt查看线程栈结构
thread n(n代表第几个线程切换线程
thread apply 1-n(第几个线程) n继续使某一线程运行
set scheduler-locking on只运行当前线程
set scheduler-locking off所有线程同步执行
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值