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 杀掉所有进程

扫描二维码关注公众号,回复: 1664234 查看本文章

其中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 所有线程同步执行

猜你喜欢

转载自blog.csdn.net/triorwy/article/details/80611199
今日推荐