gdb attach 进程调试

gdb调试正在运行的进程:

GDB可以对正在执行的程序进行调度,它允许开发人员中断程序 并查看其状态,之后还能让这个程序正常地继续执行

(gdb) attach xxxxx --- xxxxx为利用ps命令获得的子进程process id
(gdb) stop --- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch
(gdb) break 37 -- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码
Breakpoint 1 at 0x10808: file eg1.c, line 37.
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step

 在完成调试之后,不要忘记用detach命令断开连接,让被调试的进程可以继续正常运行。


我们可以通过  1)  gdb prog_name -> r               用在逐步调试自己的程序时

                    2)  gdb -> attach process_id       正在运行中的后台程序突然卡在了某个地方,先ps再gdb/attach

                    3)  gdb prog_name core              程序core掉了

三种方式对一个程序进行调试;

 

1. thread——gdb 多线程调试命令:

 

     info threads:           显示当前进程中的线程;

     thread thread_no:  进入线程xx,通常紧接而来的是 bt/f 命令;

 

2. strace/ltrace:

     前者关注系统调用和程序所接收的信号;后者关注库函数调用;

     strace的应用在 我们没有程序的源码,或者不方便从头开始运行程序时;可以方便查看一个应用程序进行了哪些系统调用。

     而在希望知道程序都调用了动态库中的哪些函数时,我们使用 ltrace。ltrace有个-S选项,类似于strace功能。

 

3.检查内存泄漏的工具:

   valgrind (in linux, free) 
   visual leak detector (windows , free)
   boundschecker(windows, free)

   profile工具:
   oprofile
   vtune

### 如何使用GDB调试Linux进程 #### 编译带有调试信息的程序 为了使 GDB 能够提供详细的调试信息,在编译 C/C++ 程序时应加入 `-g` 参数,这会使得编译器在目标文件中嵌入额外的调试数据。例如: ```bash gcc -g test.c -o test ``` 此命令将源码 `test.c` 编译成可执行文件 `test` 并包含完整的调试支持[^3]。 #### 启动GDB并加载待调试程序 通过指定要调试的应用名称来启动 GDB。如果希望立即开始调试,则可以在启动 GDB 的时候就附带应用名及其参数列表;如果不急于立刻运行被测对象,也可以先进入交互模式再做进一步操作: ```bash gdb ./test ``` 一旦进入 GDB 控制台之后就可以利用各种指令来进行断点设置、变量查看等动作了。 #### 设置断点与单步执行 当准备完毕后可以考虑在哪里暂停下来仔细观察状态变化情况——即设定断点位置。假设想要让程序停在一个特定函数处等待人工干预的话,那么只需输入如下所示语句即可完成相应配置工作: ```bash break main ``` 上述代码会在名为main()的地方建立一个停止点以便后续分析之用。另外还有一种方式叫做“条件性中断”,它允许开发者定义某些逻辑表达式作为触发依据从而实现更加精准化的控制效果。 对于简单的逐步跟踪需求来说,“step” 或者 “next” 命令将会非常有用。“step” 可以深入到子调用内部继续探索下去而不会跳过任何细节部分;相反地,“next” 则只会停留在当前层面上按顺序依次走过每一行有效代码直到遇到返回为止[^2]。 #### 处理多进程环境下的特殊情况 针对存在父子关系链路结构复杂场景中的问题排查任务而言,GDB 提供了一些专门用于管理此类状况的功能特性。比如可以通过下面这条指令获取所有已知活动单元编号清单: ```bash info inferiors ``` 紧接着便能借助于切换上下文的方法快速定位至感兴趣的那一个实例上去开展下一步的研究计划: ```bash inferior N ``` 这里N代表的就是之前查询所得结果集中某一行所对应的ID号。除此之外还有诸如attach/detach之类的高级技巧可供选择,它们分别对应着主动连接外部正在独立运作的目标实体以及解除关联的动作描述[^1]。 #### 实际案例演练 考虑到理论知识总是显得有些抽象难懂,不妨给出一段具体的Python脚本例子来做更直观的感受吧! 设想有一个简单父-子双线程架构的小工具需要我们去探究其行为特征... ```python import os print(f"Parent PID {os.getpid()}") def child(): pid = os.fork() if not pid: print(f'Child process, PID={os.getpid()}, PPID={os.getppid()}') child() while True: pass ``` 现在按照前面介绍过的流程一步步走下去就能轻松掌握整个过程啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值