如何让LLDB在内存中打印共享库的位置?

时间:2015-11-30 17:01:24

标签: macos debugging dynamic-linking lldb address-space

我在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)

2 个答案:

答案 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

但无论如何,这应该是如何运作的。