Dan*_*ien 3 debugging macos dynamic-linking address-space lldb
我正在尝试收集有关在Mac OS 10.11.1'El Capitan'上使用Valgrind 3.11.0时出现的明显死循环问题的尽可能多的信息。
当我valgrind在LLDB中的程序上valgrind运行或附加到运行程序然后停止进程时,我得到如下所示的回溯:
*线程#1:tid = 0x24ab4,0x000000010805920b,停止原因=信号SIGSTOP
*帧#0:0x000000010805920b
框架1:0x0000000108040dda
框架2:0x00000001080b6790
帧#3:0x00000001080b2fd3
框架4:0x00000001080b7c25
框架5:0x00000001080b6113
帧6:0x00000001080b3cd0
帧#7:0x00000001080c54d9
如何分辨这些框架对应的对象?
我尝试vmmap了该过程,但未显示任何信息。特别是,“进程的不可写区域”部分通常会显示将dylib映射到进程的内存中的地址范围:
$ vmmap -v 21729
流程:memcheck-amd64-darwin [21729]
路径:/usr/local/cellar/valgrind/3.11.0/lib/valgrind/memcheck-amd64-darwin
加载地址:0x100000000
标识符:memcheck-amd64-darwin
版本:???
代码类型:X86-64
父流程:bash [11895]
日期/时间:2015-11-30 11:52:16.392 -0500
发射时间:2015-11-30 11:51:53.557 -0500
作业系统版本:Mac OS X 10.11.1(15B42)
报告版本:7
分析工具:/Applications/Xcode.app/Contents/Developer/usr/bin/vmmap
分析工具版本:Xcode 7.1.1(7B1005)
----
进程21729的虚拟内存映射(memcheck-amd64-darwin)
输出报告格式:2.4-64位进程
VM页面大小:4096字节
====进程21729的不可写区域
区域类型的开始-结束[VSIZE RSDNT DIRTY SWAP] PRT / MAX SHRMOD清除区域的详细信息
====处理21729的可写区域
区域类型的开始-结束[VSIZE RSDNT DIRTY SWAP] PRT / MAX SHRMOD清除区域的详细信息
====图例
SM =共享模式:
COW = copy_on_write PRV =私有NUL =空ALI =别名
SHM =共享ZER =零填充S / A =共享别名
PURGE =可清除模式:
V =易失性N =非易失性E =空否则无法清除
====流程21729的摘要
(空值)
(lldb) image lookup -va <ADDRESS>
Run Code Online (Sandbox Code Playgroud)
将显示一堆有关给定地址的信息,并且:
(lldb) image list
Run Code Online (Sandbox Code Playgroud)
将列出所有库,并且
(lldb) image dump sections
Run Code Online (Sandbox Code Playgroud)
将转储有关所有已加载库的节位置的详细信息。
但是,如果lldb能够找出在帧打印中映射到给定地址的库,那将表明(除非您更改了帧格式设置。)因此这些命令可能不会为您显示更多信息要么。
请注意,valgrind确实会对程序的执行产生怪异的作用,以发挥其魔力,而且如果lldb和vmmap之类的外部工具看不到根本的真相,我也不会感到惊讶。
由于您具有最新的操作系统和工具,因此可以尝试使用llvm的ASAN代替valgrind,并查看它是否能够解决您的问题。ASAN需要重新构建,但是由于它静态地进行了欺骗,因此运行时对于其他工具而言看起来很正常。