Linux下通过线程死锁生成Dump文件并分析
  YteZO9lSA1uu 2023年11月02日 21 0

1.首先在Linux下打开自动生成Dump文件的功能。


ulimit -c unlimited //设置对core_dump文件大小的限制为无限
ulimit -c //查询core_dump文件大小的限制,显示为0表示关闭

Linux下通过线程死锁生成Dump文件并分析_Linux

2.在Linux下创建test.cpp写入以下代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
mutex m1,m2;
void func_2()
{
    m2.lock();
    cout<< "Dead_Lock"<<endl;
    m1.lock();
    
}
void func_1()
{
    m1.lock();
    chrono::milliseconds dura( 1000 );// delay to trigger dead_lock
    this_thread::sleep_for( dura );  
    m2.lock();
    
}
int main()
{
    thread t1(func_1);
    thread t2(func_2);
    t1.join();
    t2.join();
    return 0;
}

       在这段代码中,有两个线程t1和t2,它们分别调用func_1和func_2函数。func_1函数首先获取m1互斥锁,然后延时一段时间,接着尝试获取m2互斥锁。而func_2函数则相反,首先获取m2互斥锁,然后尝试获取m1互斥锁。          如果t1线程先执行,它会获取m1互斥锁,然后进入延时状态。同时,t2线程会获取m2互斥锁。但是,当t1线程结束延时后,它需要获取m2互斥锁才能继续执行,而此时m2已经被t2线程占用了。同样地,t2线程需要获取m1互斥锁才能继续执行,而此时m1已经被t1线程占用了。因此,两个线程都无法继续执行,形成了死锁。

3.编译

g++ -std=c++11 -g test.cpp -o test -pthread

       在C++11之前,C++标准库并没有提供原生的多线程支持。因此,如果你想要在C++中进行多线程编程,需要使用操作系统提供的线程库,如POSIX线程库(pthread)或Windows线程库。

         但是,C++11引入了自己的线程库,即<thread>头文件和std::thread类等。这个新的线程库提供了更高级的抽象和更方便的接口,使得多线程编程更加容易和安全。因此,在使用C++11线程库时,需要使用-std=c++11或更高版本的标准来启用C++11特性。 -pthread链接线程库。

4.运行

./test

5.此时程序并不会奔溃退出,需要通过kill 指令来杀死程序,kill杀死程序可选择的信号有许多,我们选择SIGQUIT(3),:由终端产生的退出信号,快捷键是Ctrl+\。主动结束程序后会生成Dump文件。 ctrl+c 同样可以终止程序,但是ctrl+c发送的信号是SIGINT 不属于用于进行调试和故障排除的信号。

Linux下通过线程死锁生成Dump文件并分析_Dump_02

6.后续通过GDB对Dump文件进行分析,可以通过其中的关键字__lll_lock_wait ()判断为死锁。

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".
Core was generated by `./test'.
Program terminated with signal SIGQUIT, Quit.
#0  0x00007fe10bca95e5 in pthread_join () from /usr/lib64/libpthread.so.0
#0  0x00007fe10bca95e5 in pthread_join () from /usr/lib64/libpthread.so.0
No symbol table info available.
#1  0x00007fe10c496c37 in std::thread::join() () from /usr/lib64/libstdc++.so.6
No symbol table info available.
#2  0x000000000040115d in main () at test.cpp:26
        t1 = {_M_id = {_M_thread = 140604538238720}}
        t2 = {_M_id = {_M_thread = 140604529846016}}
  Id   Target Id         Frame 
  3    Thread 0x7fe10b0e2700 (LWP 50004) 0x00007fe10bcaff1d in __lll_lock_wait () from /usr/lib64/libpthread.so.0
  2    Thread 0x7fe10b8e3700 (LWP 50003) 0x00007fe10bcaff1d in __lll_lock_wait () from /usr/lib64/libpthread.so.0
* 1    Thread 0x7fe10c8e5740 (LWP 50002) 0x00007fe10bca95e5 in pthread_join () from /usr/lib64/libpthread.so.0

Thread 3 (Thread 0x7fe10b0e2700 (LWP 50004)):
#0  0x00007fe10bcaff1d in __lll_lock_wait () from /usr/lib64/libpthread.so.0
#1  0x00007fe10bcaa89d in pthread_mutex_lock () from /usr/lib64/libpthread.so.0
#2  0x000000000040102e in __gthread_mutex_lock (__mutex=0x605320 <m1>) at /usr/include/c++/4.9.2/x86_64-neokylin-linux/bits/gthr-default.h:748
#3  0x0000000000401434 in std::mutex::lock (this=0x605320 <m1>) at /usr/include/c++/4.9.2/mutex:135
#4  0x00000000004010f2 in func_2 () at test.cpp:11
#5  0x0000000000402873 in std::_Bind_simple<void (*())()>::_M_invoke<>(std::_Index_tuple<>) (this=0x11862c8) at /usr/include/c++/4.9.2/functional:1700
#6  0x00000000004027bb in std::_Bind_simple<void (*())()>::operator()() (this=0x11862c8) at /usr/include/c++/4.9.2/functional:1688
#7  0x0000000000402738 in std::thread::_Impl<std::_Bind_simple<void (*())()> >::_M_run() (this=0x11862b0) at /usr/include/c++/4.9.2/thread:115
#8  0x00007fe10c496da0 in ?? () from /usr/lib64/libstdc++.so.6
#9  0x00007fe10bca852a in start_thread () from /usr/lib64/libpthread.so.0
#10 0x00007fe10b9e47bd in clone () from /usr/lib64/libc.so.6

Thread 2 (Thread 0x7fe10b8e3700 (LWP 50003)):
#0  0x00007fe10bcaff1d in __lll_lock_wait () from /usr/lib64/libpthread.so.0
#1  0x00007fe10bcaa89d in pthread_mutex_lock () from /usr/lib64/libpthread.so.0
#2  0x000000000040102e in __gthread_mutex_lock (__mutex=0x605360 <m2>) at /usr/include/c++/4.9.2/x86_64-neokylin-linux/bits/gthr-default.h:748
#3  0x0000000000401434 in std::mutex::lock (this=0x605360 <m2>) at /usr/include/c++/4.9.2/mutex:135
#4  0x0000000000401124 in func_1 () at test.cpp:19
#5  0x0000000000402873 in std::_Bind_simple<void (*())()>::_M_invoke<>(std::_Index_tuple<>) (this=0x1186038) at /usr/include/c++/4.9.2/functional:1700
#6  0x00000000004027bb in std::_Bind_simple<void (*())()>::operator()() (this=0x1186038) at /usr/include/c++/4.9.2/functional:1688
#7  0x0000000000402738 in std::thread::_Impl<std::_Bind_simple<void (*())()> >::_M_run() (this=0x1186020) at /usr/include/c++/4.9.2/thread:115
#8  0x00007fe10c496da0 in ?? () from /usr/lib64/libstdc++.so.6
#9  0x00007fe10bca852a in start_thread () from /usr/lib64/libpthread.so.0
#10 0x00007fe10b9e47bd in clone () from /usr/lib64/libc.so.6

Thread 1 (Thread 0x7fe10c8e5740 (LWP 50002)):
#0  0x00007fe10bca95e5 in pthread_join () from /usr/lib64/libpthread.so.0
#1  0x00007fe10c496c37 in std::thread::join() () from /usr/lib64/libstdc++.so.6
#2  0x000000000040115d in main () at test.cpp:26
Dump of assembler code for function pthread_join:
   0x00007fe10bca94f0 <+0>:	mov    0x2d0(%rdi),%eax
   0x00007fe10bca94f6 <+6>:	test   %eax,%eax
   0x00007fe10bca94f8 <+8>:	js     0x7fe10bca9630 <pthread_join+320>
   0x00007fe10bca94fe <+14>:	cmp    %rdi,0x628(%rdi)
   0x00007fe10bca9505 <+21>:	mov    $0x16,%eax
   0x00007fe10bca950a <+26>:	je     0x7fe10bca95c9 <pthread_join+217>
   0x00007fe10bca9510 <+32>:	push   %r15
   0x00007fe10bca9512 <+34>:	push   %r14
   0x00007fe10bca9514 <+36>:	mov    %rsi,%r14
   0x00007fe10bca9517 <+39>:	push   %r13
   0x00007fe10bca9519 <+41>:	push   %r12
   0x00007fe10bca951b <+43>:	push   %rbp
   0x00007fe10bca951c <+44>:	push   %rbx
   0x00007fe10bca951d <+45>:	mov    %rdi,%rbx
   0x00007fe10bca9520 <+48>:	mov    %fs:0x10,%r12
   0x00007fe10bca9529 <+57>:	sub    $0x28,%rsp
   0x00007fe10bca952d <+61>:	nop
   0x00007fe10bca952e <+62>:	lea    0x628(%rdi),%r13
   0x00007fe10bca9535 <+69>:	lea    -0x6c(%rip),%rsi        # 0x7fe10bca94d0 <cleanup>
   0x00007fe10bca953c <+76>:	mov    %rsp,%rdi
   0x00007fe10bca953f <+79>:	mov    %rsp,%r15
   0x00007fe10bca9542 <+82>:	mov    %r13,%rdx
   0x00007fe10bca9545 <+85>:	callq  0x7fe10bcafa10 <_pthread_cleanup_push>
   0x00007fe10bca954a <+90>:	callq  0x7fe10bcafe10 <__pthread_enable_asynccancel>
   0x00007fe10bca954f <+95>:	cmp    %r12,%rbx
   0x00007fe10bca9552 <+98>:	mov    %eax,%r8d
   0x00007fe10bca9555 <+101>:	je     0x7fe10bca95fd <pthread_join+269>
   0x00007fe10bca955b <+107>:	cmp    %rbx,0x628(%r12)
   0x00007fe10bca9563 <+115>:	je     0x7fe10bca95f0 <pthread_join+256>
   0x00007fe10bca9569 <+121>:	xor    %eax,%eax
   0x00007fe10bca956b <+123>:	lock cmpxchg %r12,0x0(%r13)
   0x00007fe10bca9571 <+129>:	jne    0x7fe10bca9640 <pthread_join+336>
   0x00007fe10bca9577 <+135>:	mov    0x2d0(%rbx),%eax
   0x00007fe10bca957d <+141>:	test   %eax,%eax
   0x00007fe10bca957f <+143>:	mov    %eax,%edx
   0x00007fe10bca9581 <+145>:	jne    0x7fe10bca95d0 <pthread_join+224>
   0x00007fe10bca9583 <+147>:	mov    %r8d,%edi
   0x00007fe10bca9586 <+150>:	callq  0x7fe10bcafe70 <__pthread_disable_asynccancel>
   0x00007fe10bca958b <+155>:	xor    %esi,%esi
   0x00007fe10bca958d <+157>:	mov    %r15,%rdi
   0x00007fe10bca9590 <+160>:	callq  0x7fe10bcafa30 <_pthread_cleanup_pop>
   0x00007fe10bca9595 <+165>:	test   %r14,%r14
   0x00007fe10bca9598 <+168>:	movl   $0xffffffff,0x2d0(%rbx)
   0x00007fe10bca95a2 <+178>:	je     0x7fe10bca95ae <pthread_join+190>
   0x00007fe10bca95a4 <+180>:	mov    0x630(%rbx),%rax
   0x00007fe10bca95ab <+187>:	mov    %rax,(%r14)
   0x00007fe10bca95ae <+190>:	mov    %rbx,%rdi
   0x00007fe10bca95b1 <+193>:	xor    %ebp,%ebp
   0x00007fe10bca95b3 <+195>:	callq  0x7fe10bca8270 <__free_tcb>
   0x00007fe10bca95b8 <+200>:	nop
   0x00007fe10bca95b9 <+201>:	add    $0x28,%rsp
   0x00007fe10bca95bd <+205>:	mov    %ebp,%eax
   0x00007fe10bca95bf <+207>:	pop    %rbx
   0x00007fe10bca95c0 <+208>:	pop    %rbp
   0x00007fe10bca95c1 <+209>:	pop    %r12
   0x00007fe10bca95c3 <+211>:	pop    %r13
   0x00007fe10bca95c5 <+213>:	pop    %r14
   0x00007fe10bca95c7 <+215>:	pop    %r15
   0x00007fe10bca95c9 <+217>:	repz retq 
   0x00007fe10bca95cb <+219>:	nopl   0x0(%rax,%rax,1)
   0x00007fe10bca95d0 <+224>:	lea    0x2d0(%rbx),%rdi
   0x00007fe10bca95d7 <+231>:	xor    %esi,%esi
   0x00007fe10bca95d9 <+233>:	xor    %r10,%r10
   0x00007fe10bca95dc <+236>:	mov    $0xca,%rax
   0x00007fe10bca95e3 <+243>:	syscall 
=> 0x00007fe10bca95e5 <+245>:	cmpl   $0x0,(%rdi)
   0x00007fe10bca95e8 <+248>:	jne    0x7fe10bca95dc <pthread_join+236>
   0x00007fe10bca95ea <+250>:	jmp    0x7fe10bca9583 <pthread_join+147>
   0x00007fe10bca95ec <+252>:	nopl   0x0(%rax)
   0x00007fe10bca95f0 <+256>:	testb  $0x3c,0x308(%rbx)
   0x00007fe10bca95f7 <+263>:	jne    0x7fe10bca9569 <pthread_join+121>
   0x00007fe10bca95fd <+269>:	mov    0x308(%r12),%eax
   0x00007fe10bca9605 <+277>:	mov    $0x23,%ebp
   0x00007fe10bca960a <+282>:	and    $0xffffffb9,%eax
   0x00007fe10bca960d <+285>:	cmp    $0x8,%eax
   0x00007fe10bca9610 <+288>:	je     0x7fe10bca9569 <pthread_join+121>
   0x00007fe10bca9616 <+294>:	mov    %r8d,%edi
   0x00007fe10bca9619 <+297>:	callq  0x7fe10bcafe70 <__pthread_disable_asynccancel>
   0x00007fe10bca961e <+302>:	xor    %esi,%esi
   0x00007fe10bca9620 <+304>:	mov    %r15,%rdi
   0x00007fe10bca9623 <+307>:	callq  0x7fe10bcafa30 <_pthread_cleanup_pop>
   0x00007fe10bca9628 <+312>:	jmp    0x7fe10bca95b8 <pthread_join+200>
   0x00007fe10bca962a <+314>:	nopw   0x0(%rax,%rax,1)
   0x00007fe10bca9630 <+320>:	mov    $0x3,%eax
   0x00007fe10bca9635 <+325>:	retq   
   0x00007fe10bca9636 <+326>:	nopw   %cs:0x0(%rax,%rax,1)
   0x00007fe10bca9640 <+336>:	mov    $0x16,%ebp
   0x00007fe10bca9645 <+341>:	jmp    0x7fe10bca9616 <pthread_join+294>
End of assembler dump.
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  C0RG5J2hUEP5   2023年11月02日   40   0   0 c语言递归迭代c++算法
  JiJ96DoSHEh4   2023年11月19日   15   0   0 bashlinux
  dUbcXj9lnElT   2023年11月02日   29   0   0 #includei++c++
  uRXtDv0LQww7   2023年12月11日   15   0   0 linux
YteZO9lSA1uu
最新推荐 更多