嵌入式 GDB调试死锁示例

死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被  

其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。

 

gdb调试死锁的方法:

gdb 

attach pid

thread apply all bt

 

找到_lll_lock_wait 锁等待的地方。

然后查找该锁被哪个线程锁住了。

例如:

 

查看哪个线程拥有互斥体

(gdb) print AccountA_mutex

$1 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2527,

__m_kind = 0, __m_lock

= {__status = 1, __spinlock = 0}}

(gdb) print 0x2527

$2 = 9511

(gdb) print AccountB_mutex

$3 = {__m_reserved = 2, __m_count = 0, __m_owner = 0x2529,

__m_kind = 0, __m_lock = {__status = 1, __spinlock = 0}}

(gdb) print 0x2529

$4 = 9513

(gdb)

从上面的命令中,我们可以看出AccontA_mutex是被线程 5(LWP 9511)加锁(拥有)的,而AccontB_mutex是被线程 3(LWP 9513)加锁(拥有)的。

 

找出死锁的地方,对应检查代码就可以了。死锁大多是对锁的使用发生交叉所致的,解决死锁的方法常有:

有序资源分配法

<span style="font-family:Courier New;font-size:12px;">是操作系统中预防死锁的一种算法,这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须以上升的次序。
系统要求申请进程:
1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2、在申请不同类资源时,必须按各类设备的编号依次申请。
例如:进程PA,使用资源的顺序是R1,R2;
           进程PB,使用资源的顺序是R2,R1;
若采用动态分配有可能形成环路条件,造成死锁。
采用有序资源分配法:R1的编号为1,R2的编号为2;
PA:申请次序应是:R1,R2
PB:申请次序应是:R1,R2
这样就破坏了环路条件,避免了死锁的发生。
另外,还有死锁避免,死锁检测与恢复等。 </span>

银行家算法

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

为保证资金的安全,银行家规定:

(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;

(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;

(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;

(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

时间: 2024-09-27 21:26:05

嵌入式 GDB调试死锁示例的相关文章

《嵌入式 Linux C 语言应用程序设计(修订版)》——2.4 嵌入式Linux调试器GDB的使用

2.4 嵌入式Linux调试器GDB的使用 在程序编译通过生成可执行文件之后,就进入了程序的调试环节.调试一直来是程序开发中的重中之重,如何使程序员能够迅速找到错误的原因是一款调试器的目标. GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具. 一个出色的调试器需要有以下几项功能. 能够运行程序,设置所有能影响程序运行的参数. 能够让程序让指定的条件下停止. 能够在程序停止时检查所有参数的情况. 能够根据指定条件改变程序的运行. 2.4.1 GDB使用

《嵌入式 Linux C 语言应用程序设计(修订版)》一2.4 嵌入式Linux调试器GDB的使用

2.4 嵌入式Linux调试器GDB的使用 嵌入式 Linux C 语言应用程序设计(修订版)在程序编译通过生成可执行文件之后,就进入了程序的调试环节.调试一直来是程序开发中的重中之重,如何使程序员能够迅速找到错误的原因是一款调试器的目标. GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具. 一个出色的调试器需要有以下几项功能. 能够运行程序,设置所有能影响程序运行的参数.能够让程序让指定的条件下停止.能够在程序停止时检查所有参数的情况.能够根据指定

使用GDB进行嵌入式远程调试

PC主机:Ubuntu 10.4  目标板:TQ2440开发板,linux内核2.6.30 NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦. 使用nfs服务可以参考:S3C2440挂载NFS文件系统 1. 概述 所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试.也就是说,在PC端调试开发板上的程序.请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug informa

gcc-怎么用GDB调试数据库找错。

问题描述 怎么用GDB调试数据库找错. 用gcc怎么编译数据库,然后用gdb调试数据库,找出数据库中的错误,然后进行改正. 解决方案 gdb不是用来调试数据库的.你要调试数据库,要用数据库提供的工具.比如sql server提供的profiler. 解决方案二: 数据库?那应该是直接用数据库客户端来连接测试 解决方案三: gcc 编译,命令行示例网上很多,Debug 模式就可以调试.数据库中的错误,需要你分析代码. 当然, GDB 可以调试对数据库的使用代码,但分析代码还是要依赖人.

比较全面的gdb调试命令

用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成.在这里并不是要和Win

《深入剖析Nginx》——第2章  跟踪与调试2.1 利用gdb调试

第2章 跟踪与调试 跟踪与调试,不仅是我们解决程序Bug的有力途径,也是帮助我们理解现有代码的有效方法.通过跟踪程序执行的过程,我们可以清楚地了解程序的内部逻辑,对于不明就里的实现细节,调试查看程序内部变量也能更好地帮助我们做出正确的理解.本章将介绍一些跟踪与调试程序的方法,除了最基本的 gdb 调试,我还将结合个人经验,介绍一些相对高级的应用技巧. 2.1 利用gdb调试 gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb

《深入剖析Nginx》一2.1 利用gdb调试

2.1 利用gdb调试 深入剖析Nginx gdb是Linux下调试程序的常用工具,任何Linux开发工程师初学程序调试时第一个接触到的工具应该就是gdb.关于gdb本身的详细用法,我们不多详述,读者可以参考gdb官网手册1,而在这里,我们将重点介绍一些与Nginx相关的注意点与调试技巧. 2.1.1 绑定Nginx到gdb 利用gdb调式Nginx,首先得在生成Nginx程序时把-g编译选项打开.当然,这并不是说不打开-g选项就无法用gdb调试它,只是会因为缺少相应的符号信息导致调试不便,而此

用gdb分析core文件及常见gdb命令操作示例

1.概述 在实际的软件开发项目中,程序出现问题是在所难免的.遥想本人参加工作之后首次遇到程序的情景,至今还历历在目.之前的经验告诉我,我们越是惊慌失措,问题就越是解决不了.我们要先让自己平静下来,然后再寻找解决程序问题的办法. 在Linux下做开发的朋友,想必都与core文件打过交道.当看到自己的程序运行之后出现core时,很多人都慌乱了,仿佛天快要塌下来一样.其实,我们大可不必如此,只要我们掌握了用gdb调试core文件的办法,依然可以很快定位程序问题,一举将bug消灭掉.有关Linux co

在Linux中如何使用gdb调试C程序

无论多么有经验的程序员,开发的任何软件都不可能完全没有 bug.因此,排查及修复 bug 成为软件开发周期中最重要的任务之一.有许多办法可以排查 bug(测试.代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复. 如果你是 C/C++ 程序员,或者使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 - GDB - 可以帮你更轻松地调试代码 bug 以及其它问题.在这篇文章中,我们将讨论一下 GDB 调试