是否有可能在vDSO呼叫中获得回溯?

时间:2016-01-27 14:14:10

标签: multithreading gdb deadlock system-calls backtrace

我试图使用gdb在我的代码中调试死锁问题。当程序被锁定时,我用gdb附加它以查看线程正在做什么。出于某种原因,我无法获得当前线程以外的线程的回溯:

(gdb) bt
#0  0xb774dcb0 in ?? ()
#1  0x8420e178 in TableCollect 
#2  0x84200c12 in main
(gdb) thread apply all bt

Thread 3 (Thread 0xb6becb40 (LWP 18937)):
#0  0xb774dcb0 in ?? ()
#1  0x000d6ee6 in ?? ()

Thread 2 (Thread 0xb1f5eb40 (LWP 18939)):
Python Exception <class 'gdb.MemoryError'> Cannot access memory at address 0x5:
#0  0xb774dcb0 in ?? ()
Cannot access memory at address 0x5
(gdb) info threads
  Id   Target Id         Frame
  3    Thread 0xb6becb40 (LWP 18937) "loader.elf" 0xb774dcb0 in ?? ()
  2    Thread 0xb1f5eb40 (LWP 18939) "Tuner" 0xb774dcb0 in ?? ()
* 1    Thread 0xb6bed700 (LWP 18936) "loader.elf" 0xb774dcb0 in ?? ()
(gdb) thread 2
[Switching to thread 2 (Thread 0xb1f5eb40 (LWP 18939))]
#0  0xb774dcb0 in ?? ()
(gdb) bt
Python Exception <class 'gdb.MemoryError'> Cannot access memory at address 0x5:
#0  0xb774dcb0 in ?? ()
Cannot access memory at address 0x5
(gdb) thread 3
[Switching to thread 3 (Thread 0xb6becb40 (LWP 18937))]
#0  0xb774dcb0 in ?? ()
(gdb) bt
#0  0xb774dcb0 in ?? ()
#1  0x000d6ee6 in ?? ()

ninja@vm:build$ cat /proc/`pidof loader.elf`/maps | grep b774d
b774b000-b774d000 r--p 00000000 00:00 0          [vvar]
b774d000-b774f000 r-xp 00000000 00:00 0          [vdso]

所以看起来所有线程都在系统调用中?这可能是因为我期待它们全部停留在ptread_mutex_lock上,但为什么我不能拥有有效的堆栈帧呢?为什么线程2的0x5地址?为什么线程3在堆栈上有0xd6ee6,甚至在内存映射中都没有提到?

0 个答案:

没有答案