Macos 如何让LLDB打印内存中共享库的位置?
在Mac OS 10.11.1“El Capitan”上使用Valgrind 3.11.0时,我试图收集尽可能多的信息 当我在LLDB中对我的程序运行Macos 如何让LLDB打印内存中共享库的位置?,macos,debugging,dynamic-linking,lldb,address-space,Macos,Debugging,Dynamic Linking,Lldb,Address Space,在Mac OS 10.11.1“El Capitan”上使用Valgrind 3.11.0时,我试图收集尽可能多的信息 当我在LLDB中对我的程序运行valgrind或连接到运行我的程序的valgrind并停止进程时,我会得到如下回溯: * thread #1: tid = 0x24ab4, 0x000000010805920b, stop reason = signal SIGSTOP * frame #0: 0x000000010805920b frame #1: 0x00000
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
将列出所有库,以及
(lldb) image dump sections
将转储有关所有已加载库的节位置的详细信息
但是,如果lldb能够在帧打印中找出在给定地址映射的库,它就会显示出来(除非您更改了帧格式设置),因此这些命令可能也不会显示更多内容
请注意,valgrind对程序的执行做了一些奇怪的事情,以便发挥其魔力,如果像lldb&vmmap这样的外部工具无法看到潜在的真相,我一点也不会感到惊讶
由于您有一个最新的操作系统和工具,您可以尝试llvm的ASAN而不是valgrind,看看它是否抓住了您的问题。ASAN需要重建,但因为它静态地完成了它的功能,所以运行时看起来与其他工具很正常。我使用valgrind已经很久了,我完全忘记了调试是如何使用它的 要调试在valgrind下运行的程序,您必须告诉valgrind打开一个gdbserver端口,以便调试器与之对话。Valgrind知道如何撤销它的所有魔法,并假装它正在管理的程序只是一个普通程序 如第3.2节所述: LLDB还知道如何使用gdb远程协议进行通话,并拥有连接到服务器的命令
gdb remote
这不适用于直接开箱即用的lldb,似乎寄存器定义存在一些问题。似乎valgrind上有一些改进工作:
但无论如何,这就是它的工作原理。谢谢,这回答了我的问题。不幸的是,尝试这些命令会导致“错误:目标没有关联的可执行映像”,但我认为在
valgrind
@DanielTrebbien上使用LLDB时会出现这种情况,我对这个结果感到惊讶。我在我的机器上尝试了这个方法,效果很好(尽管它列出了valgrind
的内存映射,而不是嵌套的来宾可执行文件)。这是意料之中的。当然,这个评论已经有两年多的历史了。。
(lldb) image lookup -va <ADDRESS>
(lldb) image list
(lldb) image dump sections