
文章插图
这时使用如下命令查看当前centos系统所有进程的状态:发现父进程PID为23869,通过fork产生的子进程为23873:
[vfhky@typecodes ~]$ pstree -pul

文章插图
同时,使用命令cat /proc/23869/status查看当前进程的详细信息:进程PID为23869,它的父进程(即GDB进程)为23859,同时这也是追踪进程ID,线程数Threads为1(共享使用该信号描述符的线程数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符) 。

文章插图
3.3 设置第一个断点在程序的第18行设置断点:
(gdb) b gdb_pthread.c:18Breakpoint 2 at 0x4007b7: file gdb_pthread.c, line 18.(gdb) info b ######列出所有断点和捕捉点Num Type Disp Enb Address What1 catchpoint keep y fork, process 23873 ########子进程23873 catchpoint already hit 1 time2 breakpoint keep y 0x00000000004007b7 in main at gdb_pthread.c:18(gdb)3.4 执行到第一个断点(gdb) c #####执行到第18行处的断点Continuing.[New process 23873] #####父进程23869执行完第1个捕捉点的程序,产生子进程23873[Thread debugging using libthread_db enabled]Using host libthread_db library "/lib64/libthread_db.so.1".Breakpoint 2, main (argc=1, argv=0x7fffffffe4c8) at gdb_pthread.c:18 ##########父进程执行到第18行处的断点18 if(pid != 0)(gdb) info threads ####查看所有运行的线程,有父进程23869和子进程23873 Id Target Id Frame2 Thread 0x7ffff7fe1740 (LWP 23873) "gdb_pthread" 0x00007ffff709b50c in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/fork.c:130* 1 Thread 0x7ffff7fe1740 (LWP 23869) "gdb_pthread" main (argc=1, argv=0x7fffffffe4c8) at gdb_pthread.c:18(gdb) info inferiors #####显示正在调试的进程 Num Description Executable2 process 23873 /home/vfhky/bin/gdb_pthread ########子进程* 1 process 23869 /home/vfhky/bin/gdb_pthread ########父进程(gdb) info b #######查看当前所有的断点Num Type Disp Enb Address What1 catchpoint keep y fork, process 23873catchpoint already hit 1 time2 breakpoint keep y <MULTIPLE>breakpoint already hit 1 time2.1 y 0x00000000004007b7 in main at gdb_pthread.c:18 inf 22.2 y 0x00000000004007b7 in main at gdb_pthread.c:18 inf 1(gdb)截图如下:

文章插图
这时使用命令查看当前系统进程的状态:发现此时仍然只有父进程23869和子进程23873 。
[vfhky@typecodes ~]$ pstree -pul

文章插图
3.5 执行到第一个断点此时如果切换到子进程23873(gdb) inferior 2[Switching to inferior 2 [process 23873] (/home/vfhky/bin/gdb_pthread)][Switching to thread 2 (Thread 0x7ffff7fe1740 (LWP 23873))] #0 0x00007ffff709b50c in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/fork.c:130130 pid = ARCH_FORK ();(gdb) info inferiors #####显示正在调试的进程Num Description Executable * 2 process 23873 /home/vfhky/bin/gdb_pthread #####子进程 1 process 23869 /home/vfhky/bin/gdb_pthread #####父进程(gdb)3.6 重新切换到父进程23869(gdb) inferior 1[Switching to inferior 1 [process 23869] (/home/vfhky/bin/gdb_pthread)][Switching to thread 1 (Thread 0x7ffff7fe1740 (LWP 23869))] #0 main (argc=1, argv=0x7fffffffe4c8) at gdb_pthread.c:1818 if(pid != 0)(gdb) info inferiors #####显示正在调试的进程 Num Description Executable2 process 23873 /home/vfhky/bin/gdb_pthread * 1 process 23869 /home/vfhky/bin/gdb_pthread (gdb)3.7 设置第二个断点并调试在第50行设置断点继续调试主进程(使父进程产生线程),其中父进程和线程到底是谁先执行是由内核调度控制的 。
(gdb) b gdb_pthread.c:50Breakpoint 3 at 0x4008a7: gdb_pthread.c:50. (2 locations)(gdb) c ######继续执行代码到第50行处的断点Continuing.[Parent]: [23869] [step1] ######第33行父进程打印Parent()函数中的数据[New Thread 0x7ffff6fdd700 (LWP 24024)] ######第35行父进程创建了一个线程24024(LWP表示轻量级进程)[Switching to Thread 0x7ffff6fdd700 (LWP 24024)] #####已经自动切换到线程24024(LWP表示轻量 。进程),也就是GDB继续调试线程而不是父进程了 。Breakpoint 3, ParentDo (argv=0x7fffffffe390 "Thread") at gdb_pthread.c:50 ######线程24024阻塞在程序的第50行50 printf( "[%s]: [%d] [%s] [%lu] [%s]n", argv, pid, tprefix, tid, "step2" );(gdb)这时使用命令查看当前系统进程的状态:存在父进程23869和子进程23873以及父进程创建的一个线程24024(线程用大括号{}表示) 。
[vfhky@typecodes ~]$ pstree -pul
推荐阅读
- 体检左肾有结晶 体检肾结晶很多人都有吗
- 梦自己在工地干活 梦见很多人在工地干活
- 泡茶时茶叶量多少合适
- 贴门神什么时候贴更好 门神贴多高合适
- 自制广式甜香肠的做法
- 梦见鸡蛋碎了是怎么回事 梦见好多鸡蛋碎了是什么意思
- 世界上最快的潜艇 世界最先进潜艇能下潜多深
- 自己如何泡出好喝的茶
- 载重量最大的船舶 世界上最大的船排水量多少吨
- 塑料茶杯适合泡茶叶吗
