C# 如何在使用gdb进行调试时获取所有缺少的信息

C# 如何在使用gdb进行调试时获取所有缺少的信息,c#,debugging,mono,gdb,C#,Debugging,Mono,Gdb,在使用gdb调试mono上运行的C应用程序时,我有以下调用跟踪: Thread 104 (Thread 0x7f37edec8700 (LWP 16281)): #0 pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:239 #1 0x00000000006e3ba6 in mono_os_cond_timedwait (cond=

在使用gdb调试mono上运行的C应用程序时,我有以下调用跟踪:

Thread 104 (Thread 0x7f37edec8700 (LWP 16281)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:239
#1  0x00000000006e3ba6 in mono_os_cond_timedwait (cond=0x184a1f8, mutex=0x184a1d0, timeout_ms=9435) at ../../mono/utils/mono-os-mutex.h:216
#2  0x00000000006e55d9 in mono_w32handle_timedwait_signal_naked (cond=0x184a1f8, mutex=0x184a1d0, timeout=9435, poll=0, alerted=0x7f37edec6ed0) at w32handle.c:956
#3  0x00000000006e58b1 in mono_w32handle_timedwait_signal_handle (handle=0x401, timeout=9435, poll=0, alerted=0x7f37edec6ed0) at w32handle.c:1071
#4  0x00000000006e5ca0 in mono_w32handle_wait_one (handle=0x401, timeout=9435, alertable=1) at w32handle.c:1190
#5  0x00000000006e5d60 in mono_w32handle_wait_multiple (handles=0x7f37edec7318, nhandles=1, waitall=0, timeout=9435, alertable=1) at w32handle.c:1224
#6  0x00000000006b6b48 in mono_wait_uninterrupted (thread=0x7f37f15a03c0, numhandles=1, handles=0x7f37edec7318, waitall=0, ms=9435, error=0x7f37edec7320) at threads.c:1892
#7  0x00000000006b6f26 in ves_icall_System_Threading_WaitHandle_WaitOne_internal (handle=0x401, ms=9435) at threads.c:2017
#8  0x0000000040461366 in ?? ()
#9  0x00007f37edec7410 in ?? ()
#10 0x00007f37e0002190 in ?? ()
#11 0x00007f37edec7370 in ?? ()
#12 0x00007f37edec7410 in ?? ()
#13 0x00007f37edec73c0 in ?? ()
#14 0x0000000000000000 in ?? ()
我想消除这些部分中所有的未知因素,主要是因为我在代码中看到了CPU挂钩问题,所以我只看到了问号,例如:

Thread 100 (Thread 0x7f37aad33700 (LWP 10397)):
#0  0x00000000406adc9f in ?? ()
#1  0x00007f37aad31ad0 in ?? ()
#2  0x00007f37ed69eed8 in ?? ()
#3  0x00007f37dd85b250 in ?? ()
#4  0x00007f37dd85b230 in ?? ()
#5  0x00007f37ed69eed8 in ?? ()
#6  0x00007f37dd85b250 in ?? ()
#7  0x00007f37f11812a0 in ?? ()
#8  0x00007f37ed69eec0 in ?? ()
#9  0x00007f37ed3405e0 in ?? ()
#10 0x00007f37ed6aaa18 in ?? ()
#11 0x00007f37f11812a0 in ?? ()
#12 0x00007f37f117c4f8 in ?? ()
#13 0x00007f37aad31b60 in ?? ()
#14 0x00000000406bb2c8 in ?? ()
#15 0x00007f37f11812a0 in ?? ()
#16 0x00007f37f11812a0 in ?? ()
#17 0x0000000000000098 in ?? ()
#18 0x00007f37f117f890 in ?? ()
#19 0x00007f37f117e770 in ?? ()
#20 0x00007f37f117f330 in ?? ()
#21 0x0000000000000000 in ?? ()
问题:基于低内存地址,比如0x00007f37f117f330,我假设这是用户空间代码。我在调试模式下安装了mono,没有编译器优化CFLAGS=O0。这是否意味着函数被卡住的不是mono代码,而是mono托管的应用程序?什么是证明它的最终方法

我的方式是——但这真的正确吗

[root@ct1rid5 log]# cat /proc/16281/maps | grep 7f37f1
7f37f0600000-7f37f1401000 rw-p 00000000 00:00 0
7f37f1401000-7f37f1405000 r--p 00000000 fd:00 658927                     /usr/lib/xstream/Rid/CompanyName.Configuration.Connection.dll
7f37f1405000-7f37f1423000 r--p 00000000 fd:00 151953                     /root/mono-debug-install-dir/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
7f37f1423000-7f37f151b000 r--p 00000000 fd:00 151943                     /root/mono-debug-install-dir/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll
7f37f151b000-7f37f1520000 r--p 00000000 fd:00 658933                     /usr/lib/xstream/Rid/CompanyName.Logging.dll
7f37f1520000-7f37f1524000 r--p 00000000 fd:00 152104                     /root/mono-debug-install-dir/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.pdb
7f37f1524000-7f37f1530000 r--p 00000000 fd:00 152103                     /root/mono-debug-install-dir/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll
7f37f1530000-7f37f15b2000 rw-p 00000000 00:00 0
7f37f15b2000-7f37f15b4000 r--p 00000000 fd:00 658917                     /usr/lib/xstream/Rid/ServiceStack.Logging.Log4Net.dll
7f37f15b4000-7f37f15b8000 rw-p 00000000 00:00 0
7f37f15b8000-7f37f15ba000 r--p 00000000 fd:00 658941                     /usr/lib/xstream/Rid/CompanyName.Threading.dll
7f37f15ba000-7f37f15bc000 rw-p 00000000 00:00 0
7f37f15bc000-7f37f15bd000 ---p 00000000 00:00 0
7f37f15bd000-7f37f1fbd000 rw-p 00000000 00:00 0
7f37f1fbd000-7f37f7e52000 r--p 00000000 fd:00 534745                     /usr/lib/locale/locale-archive

您可以打印每个地址的方法名称 使用

等等

要打印所有方法名,请将下面的代码放入主目录的.gdbinit中。然后可以调用mono_backtrace命令

define mono_backtrace
 select-frame 0
 set $i = 0
 while ($i < $arg0)
   set $foo = (char*) mono_pmip ($pc)
   if ($foo)
     printf "#%d %p in %s\n", $i, $pc, $foo
   else
     frame
   end
   up-silently
   set $i = $i + 1
 end
end
我在mono项目文档中找到了上述信息

仍然缺少很多信息:但这是输出:-问题:堆栈跟踪中没有任何mono函数,这是否意味着mono以某种方式失去了对该线程的控制?还有其他调试技巧吗?感谢您使用调试库??我在很大程度上使用了-我已安装:debuginfo install mono-core-5.4.0.201-0.xamarin.1.epel6.x8664,当线程正常执行时,我会看到一个正常的堆栈跟踪,如下所示:-但是当出现错误时,我看到了:-我认为不可见的函数调用来自mono运行托管代码的服务?您认为可能是这样吗?此外,这是gdb连接时的输出:-似乎所有必需的调试库都存在。
define mono_backtrace
 select-frame 0
 set $i = 0
 while ($i < $arg0)
   set $foo = (char*) mono_pmip ($pc)
   if ($foo)
     printf "#%d %p in %s\n", $i, $pc, $foo
   else
     frame
   end
   up-silently
   set $i = $i + 1
 end
end