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

How to have LLDB print the locations of shared libraries in memory?

我正在尝试收集尽可能多的关于 an apparent infinite loop issue 在 Mac OS 10.11.1 'El Capitan' 上使用 Valgrind 3.11.0 时看到的信息。

当我 运行 valgrind 在 LLDB 中的程序上或附加到 valgrind 运行ning 我的程序然后停止进程时,我得到一个像这样的回溯以下:

* 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 处理该过程,但未显示任何信息。特别是,通常显示动态库映射到进程内存的地址范围的 "Non-writable regions for process" 部分是空白的:

$ 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)
(lldb) image lookup -va <ADDRESS>

将显示有关给定地址的一堆信息, 和:

(lldb) image list

将列出所有库,并且

(lldb) image dump sections

将转储有关所有已加载库的部分位置的详细信息。

但是,如果 lldb 能够找出在帧打印中给定地址映射的库,它会显示(除非您更改了帧格式设置。)所以这些命令可能也不给你看更多了。

请注意,valgrind 会对程序的执行做一些奇怪的事情以发挥其魔力,如果像 lldb 和 vmmap 这样的外部工具无法看到潜在的真相,我一点也不会感到惊讶。

由于您有最新的 OS 和工具,您可以尝试使用 llvm 的 ASAN 而不是 valgrind,看看它是否能解决您的问题。 ASAN 需要重建,但因为它是静态运行的,所以运行时对于其他工具来说看起来很正常。

很久没用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

但不管怎样,它应该是这样工作的。