Oracle® Solaris Studio 12.4:线程分析器用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

检查出现死锁的运行

下面列出了导致实际死锁的哲学家就餐程序的一次运行。

% cc -g -o din_philo din_philo.c
% collect -r deadlock -o din_philo.1.er din_philo
Creating experiment database din_philo.1.er ...
Philosopher 1 is done thinking and now ready to eat.
Philosopher 2 is done thinking and now ready to eat.
Philosopher 3 is done thinking and now ready to eat.
Philosopher 0 is done thinking and now ready to eat.
Philosopher 1: got right  chopstick 1
Philosopher 3: got right  chopstick 3
Philosopher 0: got right  chopstick 0
Philosopher 1: got left chopstick 2
Philosopher 3: got left chopstick 4
Philosopher 4 is done thinking and now ready to eat.
Philosopher 1: eating.
Philosopher 3: eating.
Philosopher 3: got right  chopstick 3
Philosopher 4: got right  chopstick 4
Philosopher 2: got right  chopstick 2
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 1: got right  chopstick 1
Philosopher 4: got left chopstick 0
Philosopher 4: eating.
Philosopher 0: got right  chopstick 0
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
Philosopher 4: got right  chopstick 4
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
Philosopher 3: got right  chopstick 3
Philosopher 1: got left chopstick 2
Philosopher 1: eating.
Philosopher 2: got right  chopstick 2
Philosopher 0: got left chopstick 1
Philosopher 0: eating.
Philosopher 1: got right  chopstick 1
Philosopher 4: got left chopstick 0
Philosopher 4: eating.
Philosopher 0: got right  chopstick 0
Philosopher 3: got left chopstick 4
Philosopher 3: eating.
...
Philosopher 4: got right  chopstick 4
Philosopher 2: got left chopstick 3
Philosopher 2: eating.
Philosopher 2: got right  chopstick 2
Philosopher 3: got right  chopstick 3
(hang)

Execution terminated by pressing CTRL-C

键入以下命令以使用 er_print 实用程序检查实验:

% er_print din_philo.1.er
(er_print) deadlocks
Deadlock #1, Potential deadlock
        Thread #2
                Lock being held:        0x21380, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x21398, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #3
                Lock being held:        0x21398, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213b0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #4
                Lock being held:        0x213b0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213c8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #5
                Lock being held:        0x213c8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213e0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #6
                Lock being held:        0x213e0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x21380, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"

Deadlock #2, Actual deadlock
        Thread #2
                Lock being held:        0x21380, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x21398, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #3
                Lock being held:        0x21398, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213b0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #4
                Lock being held:        0x213b0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213c8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #5
                Lock being held:        0x213c8, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x213e0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
        Thread #6
                Lock being held:        0x213e0, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"
                Lock being requested:   0x21380, at: grab_chopstick + 0x00000024, line 105 in "din_philo.c"

以下屏幕抓图显示了线程分析器中显示的死锁信息。

图 3-2  din_philo.c 中检测到的死锁

image:线程分析器窗口的屏幕抓图,显示了实际的死锁。

线程分析器报告了 din_philo.c 的两个死锁,一个是潜在死锁,另一个是实际死锁。通过进一步检查,可以发现两个死锁是相同的。

该死锁涉及的循环链如下:

线程 2:在地址 0x21380 持有锁,在地址 0x21398 请求锁
线程 3:在地址 0x21398 持有锁,在地址 0x213b0 请求锁
线程 4:在地址 0x213b0 持有锁,在地址 0x213c8 请求锁
线程 5:在地址 0x213c8 持有锁,在地址 0x213e0 请求锁
线程 6:在地址 0x213e0 持有锁,在地址 0x21380 请求锁

选择循环链中的第一个线程(线程 2),然后单击 "Dual Source"(双源)视图,可以在源代码中看到,线程 2 获得了地址 0x21380 处的锁,在源代码中还可以看到,该线程请求了地址 0x21398 处的锁。

以下屏幕抓图显示了对应于线程 2 的 "Dual Source"(双源)视图。屏幕抓图的上半部分显示了线程 2 通过在第 105 行调用 pthread_mutex_lock() 获取了地址 0x21380 处的锁。屏幕抓图的下半部分显示了同一线程通过在第 105 行调用 pthread_mutex_lock() 请求了地址 0x21398 处的锁。在对 pthread_mutex_lock() 的两次调用中,分别使用了不同的锁作为参数。通常,锁获取和锁请求操作可能不在同一源代码行上。

在屏幕抓图中每个源代码行的左侧会显示缺省的度量:"Exclusive Deadlocks"(互斥死锁)度量。此度量显示了该源代码行上报告的(死锁涉及的)锁获取或锁请求操作的总次数。只有属于死锁循环链一部分的源代码行才具有此度量的值,并且该值大于零。

图 3-3  din_philo.c 中的潜在死锁

image:线程分析器 “Dual Source“(双源)标签的屏幕抓图,显示了潜在的死锁。