• lv6 嵌入式开发-4 gdb调试多进程程序


     1 调试语法

    1. set follow-fork-mode child
    2. set follow-fork-mode parent
    3. set detach-on-fork on/off
    4. info inferiors
    5. inferiors 进程序号(1,2,3....)

    on: 只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式

    off:父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。

    info inferiors    显示GDB调试的进程

    inferiors  进程序号(1,2,3....)  切换GDB调试的进程

    2 示例

    使用一段fork代码,代码实现了

    1. #include
    2. #include
    3. int main(int argc,char **argv){
    4. pid_t pid;
    5. printf("before fork\n");
    6. pid = fork();
    7. if(pid>0){
    8. printf("This is father process\n");
    9. printf("pid=%d\n",(int)pid);
    10. printf("father after fork\n");
    11. while(1){
    12. sleep(1);
    13. printf("father sleep\n");
    14. }
    15. }else if(pid==0){
    16. printf("This is child process\n");
    17. printf("pid=%d\n",(int)pid);
    18. printf("child after fork\n");
    19. while(1){
    20. sleep(1);
    21. printf("child sleep\n");
    22. }
    23. }else if(pid<0){
    24. perror("fork");
    25. return 0;
    26. }
    27. // printf("pid=%d\n",(int)pid);
    28. // printf("after fork\n");
    29. }

    编译

    gcc -g -o fork_t fork_t.c

    调试

    1. linux@linux:~/Desktop$ gdb fork_t
    2. GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
    3. ......
    4. Reading symbols from fork_t...done.
    5. (gdb) start //从main函数开始运行
    6. Temporary breakpoint 1 at 0x80484e6: file fork.c, line 10.
    7. Starting program: /home/linux/Desktop/fork_t
    8. Temporary breakpoint 1, main (argc=1, argv=0xbffff164) at fork.c:10
    9. 10 printf("before fork\n");
    10. (gdb) n
    11. before fork
    12. 11 pid = fork();
    13. (gdb)
    14. 12 if(pid>0){
    15. (gdb) This is child process
    16. pid=0
    17. child after fork
    18. child sleep
    19. child sleep
    20. child sleep
    21. child sleep
    22. child sleep

    如果想切换到父进程或者子进程

    1. linux@linux:~/Desktop$ gdb fork_t
    2. GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
    3. ......
    4. (gdb) start
    5. Temporary breakpoint 1 at 0x80484e6: file fork.c, line 10.
    6. Starting program: /home/linux/Desktop/fork_t
    7. Temporary breakpoint 1, main (argc=1, argv=0xbffff164) at fork.c:10
    8. 10 printf("before fork\n");
    9. (gdb) set follow- //tab可补全
    10. follow-exec-mode follow-fork-mode
    11. (gdb) set follow-fork-mode
    12. child parent
    13. (gdb) set follow-fork-mode
    14. child parent
    15. (gdb) set follow-fork-mode child //可选child或者parent
    16. (gdb) n
    17. before fork
    18. 11 pid = fork();
    19. (gdb) n
    20. This is father process
    21. pid=8388
    22. father after fork
    23. [New process 8388]
    24. [Switching to process 8388]
    25. 12 if(pid>0){
    26. (gdb) father sleep
    27. father sleep
    28. father sleep
    29. father sleep

    如果想同时调试父进程和子进程

    1. (gdb) set follow-fork-mode child
    2. (gdb) n
    3. (gdb) n
    4. (gdb) set detach-on-fork off //禁用自动分离功能,使得在子进程创建时调试器仍然保持连接并继续调试子进程。相反,如果您希望在子进程创建时自动分离调试器,可以将上述命令中的 "off" 替换为 "on"。
    5. (gdb) info inferiors
    6. Num Description Executable
    7. * 2 process 11419 /home/linux/Desktop/fork_t
    8. 1 process 11415 /home/linux/Desktop/fork_t
    9. (gdb) inferior 2
    10. [Switching to inferior 2 [process 11419] (/home/linux/Desktop/fork_t)]
    11. [Switching to thread 2 (process 11419)]
    12. #0 0xb7fdd424 in ?? ()
    13. (gdb) n
    14. (gdb) n
    15. (gdb) inferior 1

  • 相关阅读:
    CSS3新增选择器:兄弟选择器:+和~​​​​​​ |属性选择器:^$ *| 伪类选择器
    认证学习3 - Digest摘要认证讲解、代码实现、演示
    ElasticSearch高级功能详解与原理剖析
    使用C# RDLC环境搭建
    Cartesi 2022 年 8 月回顾
    CoLAKE: 如何实现非结构性语言和结构性知识表征的同步训练
    【集训DAY5】选数字【数学】
    学生党用什么蓝牙耳机好?学生党性价比高的蓝牙耳机推荐
    【JavaScript 漫游】【036】CORS 通信总结
    「idea」统一格式化风格,再也不用担心git冲突了,很多老管理都还不知道
  • 原文地址:https://blog.csdn.net/m0_60718520/article/details/133132261