1. 程式人生 > >Linux kernel: How to debug mutex deadlock 如何除錯mutex死鎖

Linux kernel: How to debug mutex deadlock 如何除錯mutex死鎖

和userspace除錯lock一樣,主要是要:

1. 找到lock死鎖的地方,打印出呼叫棧

2. 找出這個mutex目前被誰佔用了

針對1:在kernel config中,Kernel Hacking這個大項中,enable跟lock/mutex相關的config,比如CONFIG_DEBUG_MUTEX,以及CONFIG_DETECT_HUNG_TASKS, 這樣當死鎖發生時,稍微等待一段時間(預設120秒),kernel就會檢測到死鎖,同時打印出呼叫棧。在kernel hacking裡面,包含了大量的有利於除錯的config,可以一項一項都看一遍,總有一款適合您。

針對2:來到程式碼中死鎖的地方,在enable了CONFIG_DEBUG_MUTEX的情況下,新增這樣的程式碼:

show_stack(<lock>.owner, NULL);

<lock>是你的mutex的變數名,.owner是一個struct task_struct *,利用show_stack函式就可以打印出該mutex被誰佔用了,而且佔用該mutex時的呼叫棧。非常cool。

此外可以看一下struct mutex的定義,有一些實用的東西,比如mutex的name。struct task_struct中也有一些實用的東西,比如pid等。

所以總結來說,kernel中目前可以列印呼叫棧的有:

dump_stack:列印當前的backtrace

show_stack:列印指定task_struct的backtrace