只是为了踢,我试图创建一个拦截malloc()调用的.dylib。我想打印出分配大小和来电地址,以便以后进行调整。输出格式如下:
0x7fff93b8ffa7: 20 bytes
0x7fff69eaec18: 16 bytes
0x000100a2d45b: 8 bytes
0x000100a2d45b: 8 bytes
0x000100a2d45b: 8 bytes
这是运行这样的程序的结果:
DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=debugmalloc.dylib mybinary 2>debug.log
mybinary
可以被任何其他程序替换。 debugmalloc.dylib
是malloc()拦截器。
现在我可以开始创建直方图并计算浪费了!但是只缺少一件事:我希望看到实际(公共)呼叫者的姓名(符号),而不仅仅是地址。所以我开始环顾四周,找到一些有趣的拼图。
image lookup -address
http://lldb.llvm.org/symbolication.html进行符号化(使用otool -l $BINARY
查找__TEXT .__文本片段的addr
,并尝试使用该文件片段进行抵消。我希望这会更好,因为lldb有调试信息,因此我也可以象征内部符号。但到目前为止,我还没能回到符号的文件地址。 lldb的image lookup -address
保持沉默。我的下一步可能是更多地查看otool -l
输出,看看我是否可以将其与我正在看到的一些地址对齐,但这将是乏味的手动工作。如果有人对如何做到这一点有更好的了解,我会全力以赴。
答案 0 :(得分:2)
地址上的“图像查找”将显示文件地址:
(lldb) image lookup -a 0x7fff89e6752e
Address: libsystem_kernel.dylib[0x000000000001152e] (libsystem_kernel.dylib.__TEXT.__text + 68126)
Summary: libsystem_kernel.dylib`mach_msg_trap + 10
方括号中的数字是文件地址。当然,系统库中的所有函数都不会有符号,因为它们中的许多都被剥离了。 lldb读取库中的“Function Starts”部分(如果存在),并为这些部分组成伪符号,因此我们通常不会将地址归属为错误的符号,但名称不会很有用。
您还可以通过创建带有加载地址和目标的SBAddress,然后从SBAddress读取文件地址来获取SB API端的文件地址:
(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>> addr = lldb.SBAddress(0x7fff89e6752e, lldb.target)
>>> print "0x%x"%(addr.file_addr)
0x1152e