我在Mac OS 10.11.1'El Capitan'上使用Valgrind 3.11.0时,尽可能多地收集关于an apparent infinite loop issue的信息。
当我在LLDB中的程序上运行valgrind
或附加到valgrind
运行我的程序然后停止该过程时,我会得到如下的回溯:
* thread #1: tid = 0x24ab4, 0x000000010805920b, stop reason = signal SIGSTOP * frame #0: 0x000000010805920b frame #1: 0x0000000108040dda frame #2: 0x00000001080b6790 frame #3: 0x00000001080b2fd3 frame #4: 0x00000001080b7c25 frame #5: 0x00000001080b6113 frame #6: 0x00000001080b3cd0 frame #7: 0x00000001080c54d9
如何判断这些帧对应哪个对象?
我在这个过程中尝试vmmap
,但它没有显示任何信息。特别是,“进程的不可写区域”部分通常显示dylib映射到进程内存的地址范围是空白的:
$ vmmap -v 21729 Process: memcheck-amd64-darwin [21729] Path: /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/memcheck-amd64-darwin Load Address: 0x100000000 Identifier: memcheck-amd64-darwin Version: ??? Code Type: X86-64 Parent Process: bash [11895] Date/Time: 2015-11-30 11:52:16.392 -0500 Launch Time: 2015-11-30 11:51:53.557 -0500 OS Version: Mac OS X 10.11.1 (15B42) Report Version: 7 Analysis Tool: /Applications/Xcode.app/Contents/Developer/usr/bin/vmmap Analysis Tool Version: Xcode 7.1.1 (7B1005) ---- Virtual Memory Map of process 21729 (memcheck-amd64-darwin) Output report format: 2.4 -- 64-bit process VM page size: 4096 bytes ==== Non-writable regions for process 21729 REGION TYPE START - END [ VSIZE RSDNT DIRTY SWAP] PRT/MAX SHRMOD PURGE REGION DETAIL ==== Writable regions for process 21729 REGION TYPE START - END [ VSIZE RSDNT DIRTY SWAP] PRT/MAX SHRMOD PURGE REGION DETAIL ==== Legend SM=sharing mode: COW=copy_on_write PRV=private NUL=empty ALI=aliased SHM=shared ZER=zero_filled S/A=shared_alias PURGE=purgeable mode: V=volatile N=nonvolatile E=empty otherwise is unpurgeable ==== Summary for process 21729 (null)
答案 0 :(得分:5)
(lldb) image lookup -va <ADDRESS>
将显示有关给定地址的大量信息, 和
(lldb) image list
将列出所有库,
(lldb) image dump sections
将转储有关所有已加载库的节位置的详细信息。
但是,如果lldb能够找出帧打印中给定地址映射的库,那么它会显示(除非你改变了帧格式设置。)所以这些命令可能不会显示你或者更多。
请注意,valgrind为了实现它的魔力而对程序的执行做了一些奇怪的事情,如果lldb&amp; amp;等外部工具我也不会感到惊讶。 vmmap无法看到潜在的事实。
因为你有一个最近的OS&amp;工具,您可以尝试llvm的ASAN而不是valgrind,看看它是否能解决您的问题。 ASAN需要重建,但由于它静态地执行其技巧,因此运行时看起来与其他工具相同。
答案 1 :(得分:1)
自从我使用valgrind已经有很长一段时间了,我完全忘记了调试是如何工作的......
要调试在valgrind下运行的程序,您必须告诉valgrind打开一个gdbserver端口供调试器进行通信。 Valgrind知道如何撤消它的所有魔法,并假装它管理的程序只是一个普通的程序......
第3.2节中描述的内容:
http://valgrind.org/docs/manual/manual-core-adv.html。
LLDB也知道如何使用gdb远程协议进行通话,并且有一个命令gdb-remote
来连接到服务器。
这并不能直接使用lldb,看起来寄存器定义存在一些问题。看起来有一些关于valgrind的工作来改善这个:
https://bugs.kde.org/show_bug.cgi?id=356174
但无论如何,这应该是如何运作的。