一 调试多进程
1) follow-fork-mode :
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
在使用如下方法设置完要调试的程序后:
gdb命令行的 –-args 参数
gdb环境中 set args命令。
gdb --pid=PID(ps -ef | grep your_prog)
如果需要调试子进程,在启动gdb后:
(gdb) set follow-fork-mode child
并在子进程代码设置断点。
此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,调试起来并不方便。
2) attach调试:
GDB有附着(attach)到正在运行的进程的功能,即attach <pid>命令。因此可以利用该命令attach到子进程然后进行调试。通过ps和pstree可以查看到所要调试的子进程pid。
问题是,子进程一直在运行,attach上去后都不知道运行到哪里了。一个办法是,在要调试的子进程初始代码中,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。
Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。适合于各种复杂情况,特别是守护进程。
3) gdb wrapper:
专用于fork+exec模式,不用添加额外代码,但需要X环境支持(xterm/VNC)。
可参考:http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html
二 调试多进程
GDB多线程调试的基本命令:
info threads 查看当前进程的线程。
thread <ID> 切换调试的线程为指定ID的线程。
break [LOCATION] [thread THREADNUM] [if CONDITION] 在[LOCATION]处为[thread THREADNUM]设置断点在满足条件[if CONDITION]时停住 。
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。
on 只有当前被调试程序会执行。
step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
other:
gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:
(gdb) set $i = 0
(gdb) p a[$i++]
调试宏:在GCC编译程序的时候,加上-ggdb3参数,就可以了
info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
macro – 你可以查看宏展开的样子。
x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。
x/x 以十六进制输出
x/d 以十进制输出
x/c 以单字符输出
x/i 反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
x/s 以字符串输出
command命令,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。
(gdb) command 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>print arg1
>print arg2
>print arg3
>end
(gdb)
参考:
http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html
http://coolshell.cn/articles/3643.html
分享到:
相关推荐
调试多线程程序通常较复杂,gdb等调试器提供了线程查看和控制功能,帮助开发者定位问题。 总结,Linux系统的多线程编程为开发者提供了强大的并发能力,但也带来了挑战。理解和掌握线程创建、同步、通信和问题处理,...
现代守护进程经常使用多线程来提高并发处理能力。每个线程可以处理不同的客户端请求,提高服务效率。线程的使用需注意同步和互斥问题,避免数据竞争,确保正确性和一致性。 综上所述,Linux守护进程在系统中扮演着...
在Linux操作系统中,进程和线程是...然而,多线程编程也带来了挑战,如库函数的不稳定性、调试困难(gdb不支持线程调试)以及对信号处理的复杂性。因此,在实际应用中,需要谨慎设计和测试以确保程序的正确性和可靠性。
GDB的强大之处在于其灵活性和可扩展性,它不仅限于上述功能,还可以进行远程调试、多线程调试、内存查看等多种复杂操作。通过熟练掌握GDB,开发者能更有效地调试程序,从而提高软件质量和开发效率。
gdb能够处理多进程程序的调试,并且支持多线程程序的调试。这对于并发或并行程序中出现的线程相关的问题尤为关键。gdb能够帮助开发者理解程序中各个线程的执行流程,以及线程间的交互和同步问题。 最后,gdb还支持...
本书深入探讨了Linux系统中的线程概念、API接口、同步机制以及相关的调试技巧,旨在帮助开发者熟练掌握在Linux平台上创建和管理多线程程序的关键技能。 一、线程基础 线程是操作系统分配处理器时间的基本单元,一个...
3. **文件锁**:在多进程或多线程环境中,为了防止多个进程同时读写同一文件导致的数据不一致,Linux提供了文件锁机制。文件锁分为记录锁(记录内部分锁)和共享锁(文件范围锁),通过flock()或fcntl()函数实现。...
9. **调试与性能分析**:多线程程序的调试和性能分析通常更为复杂,需要使用特定的工具,如GDB、Visual Studio的调试器、线程分析工具等。 通过学习和掌握这些线程脚本相关的知识,开发者可以创建高效、稳定、可...
- **守护进程**:在Unix/Linux中,一些后台服务常作为守护进程运行,如`systemd`或`init`系统。 5. **进程工具**: - **任务管理器**:Windows系统自带的进程管理工具,提供查看、结束进程以及性能监控等功能。 ...
本资源提供了一个完整的嵌入式学习步骤,涵盖了 LINUX 基础、Shell 编程、C 编程、嵌入式系统开发、串口通信、多进程和多线程程序设计、嵌入式 Linux 网络编程、GUI 程序开发和 Linux 字符设备驱动程序等方面的知识...
4. **守护进程**:Linux系统中的许多服务都以守护进程形式运行,它们在后台持续工作,不受用户会话影响。 总的来说,理解和掌握Linux内核结构与进程管理是成为熟练的Linux系统管理员或开发者的基础。通过深入学习...
第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式。 第五部分(第12章)主要是HTTP协议的...
3. **多线程/进程模型**:为了处理多个并发的FTP连接,服务器通常采用多线程或多进程的方式。在Linux环境下,可以使用pthread库创建线程或fork()函数创建子进程。 4. **权限管理**:FTP服务器需要处理用户认证和...
嵌入式学习之路涵盖了一系列深度学习嵌入式系统开发所需的知识点,主要涉及Linux操作系统、Shell编程、C语言编程、嵌入式系统开发、串口通信、多进程和多线程设计、网络编程以及GUI程序开发。以下是这些领域的详细...
第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式。 第五部分(第12章)主要是HTTP协议的...
第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式; 第五部分(第12章)主要是HTTP协议的...
第四部分(第9~11章)主要是多线程、进程和进程间通信相关的知识,包括多线程的使用、多线程的同步和重入问题,进程方面有父子进程、僵死进程、守护进程和进程间通讯的方式。 第五部分(第12章)主要是HTTP协议的...
嵌入式系统中多进程程序设计是学习Linux系统进程概述、嵌入式系统的进程特点、进程操作、守护进程相关的系统调用等。这些知识点是学习多进程程序设计的基础。 6. 嵌入式系统中多线程程序设计 嵌入式系统中多线程...
嵌入式系统中多进程程序设计的学习内容包括Linux系统进程概述、进程特点、进程操作、守护进程以及相关的系统调用。学习者应能够编写多进程程序,特别是守护进程程序,以及理解进程间的同步与通信。 嵌入式系统中多...
网络编程是现代Unix应用不可或缺的部分,可能包括TCP/IP协议栈、套接字API的使用(socket、bind、listen、accept、connect、send、recv等),以及并发服务器的实现(如多线程、多进程或异步I/O模型)。 021.PDF - ...