Linux 调试与移植全解析
1. 多任务调试
在处理多线程执行时,开发者通常会遇到两种不同的调试场景。进程可以拥有自己独立的地址空间,也可以与其他执行线程共享地址空间(以及其他系统资源)。对于不共享公共地址空间的独立进程,必须使用单独的独立调试会话进行调试。我们可以在目标系统的多个进程上使用 gdbserver,并在开发主机上分别调用 GDB,以协调多个协作但独立进程的调试会话。
1.1 调试多进程
当在 GDB 下调试的进程使用fork()系统调用创建新进程时,GDB 有两种操作方式。它可以继续控制和调试父进程,也可以停止调试父进程并连接到新创建的子进程。可以使用set follow-fork-mode命令来控制这种行为,该命令有两种模式:follow parent和follow child,默认情况下 GDB 会跟随父进程。在这种情况下,子进程在fork()成功后会立即执行。
以下是一个使用fork()创建子进程的简单程序片段:
for( i=0; i<MAX_PROCESSES; i++ ) { /* Creating child process */ pid[i] = fork(); /* Parent gets non-zero PID */ if ( pid[i] == -1 ) { perror