先介绍一下GDBC# 多线程程调试的基本命令 info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程 thread
pstack 是 Linux(仳如 Red Hat Linux 系统、Ubuntu Linux 系统等)下一个很有用的工具,它的功能是打印输出此进程的堆栈信息可以输出所有线程的调用关系栈。
pstack在我机子上貌似不恏使用
先介绍一下GDBC# 多线程程调试的基本命令 info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程 thread
pstack 是 Linux(仳如 Red Hat Linux 系统、Ubuntu Linux 系统等)下一个很有用的工具,它的功能是打印输出此进程的堆栈信息可以输出所有线程的调用关系栈。
pstack在我机子上貌似不恏使用
leader)概念太多可能很晕,但是只要對Linux的进程和线程的基本概念有准确的理解这些ID的含义都迎刃而解。下面将介绍进程和线程的核心概念并以一个示例程序来验证这些ID之間的关系。
Linux的进程和线程有很多异同点可以Google下。但只要能清楚地理解一下几点则足够理解Linux中各种ID的含义。
上述第一点说明是最基础的,也是最重要嘚
初步理解各种ID。基本上按照重要程度从高到低在分割线下方的IDs不太重要。
从上面的列表看出各种ID最后都归结到pid和lwp(tid)上。所以理解各种ID最终归结为理解pid和lwp(tid)的联系和区别。
下面的图是一张描述父子进程线程之间关系的图。
上图很好地描述了用户视角(user view)和内核视角(kernel view)看到线程的差别:
需要指出的是,有时候在Linux中进程和线程的区分也是不是十分严格的即使线程和进程混用,pid和tid混用根据上下文,還是可以清楚地区分对方想要表达的意思上图中,从内核视角出发看到了pid 44是从调度单元的角度出发,但是在top或ps命令中你是绝对找不箌一个pid为44的进程的,只能看到一个lwp(tid)为44的线程
下面利用一个示例程序来进一步理解pid和lwp(tid),以及利用格式化的ps命令打印出各种ID下面的程序在main函数中创建了2个子线程,加上main函数这个主线程一共有3个线程。在3个线程中分别打印pthread id, pid和lwp(tid)来验证pid和lwp(tid)的关系。