我希望lldb在OS X应用程序的实际代码(如果存在符号的情况下可以称为main)的开头中断。

我目前正在手工查找,但是由于我要编写一些动作脚本,因此如果能够以某种方式自动实现,那就太好了



你有办法吗?

#1 楼

试试这个:

(lldb) break set -n main
(lldb) r
(lldb) thread backtrace

frame #0: 0x0000000000405696 app`main(argc=1, argv=...) + 22 at app.cpp:11
frame #1: 0x00007ffff7216ec5 libc.so.6`__libc_start_main + 245
frame #2: 0x0000000000401f79 app


main下方(之前)的框架是您想要的框架,它显示了库和函数名称。您可以像在其他任何对象上一样设置断点:

(lldb) break set -n __libc_start_main
Breakpoint 1: where = libc.so.6`__libc_start_main, address = 0x00007ffff7216dd0


,或者更具体地说:

(lldb) break set -s libc.so.6 -n __libc_start_main
Breakpoint 2: where = libc.so.6`__libc_start_main, address = 0x00007ffff7216dd0


如果您知道该地址,则可以直接使用它:

(lldb) break set -a 0x000000...


然后重新启动该过程,您应该立即点击它:

(lldb) r
There is a running process, kill it and restart?: [Y/n] y
...
* thread #1: ...__libc_start_main, name = 'app', stop reason = breakpoint
frame #0: 0x00007ffff7216dd0 libc.so.6`__libc_start_main
-> ...: pushq  %r14
(lldb)


#2 楼

尝试在错误的地址上添加断点。在GDB中,我这样做的方式是:b *0xf00或类似的东西。这就是我在GDB中的样子,也许您会找到一种复制相同行为的方法:


$ gdb ./a.out
(gdb) b *0xf00
(gdb) r
Starting program: ./a.out 
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0xf00

(gdb) x/2i $rip
=> 0x7ffff7ddb2d0 <_start>:   mov    rdi,rsp
   0x7ffff7ddb2d3 <_start+3>: call   0x7ffff7ddea70 


评论


噢,我想我误解了这个问题。尽管如此,这是一个方便的技巧:-P也许您可以找出main之前是否存在已知的入口点,例如__libc_start_main。您可能会发现,有一种半破解的方法可以在相对于入口点具有固定的,可预测的偏移量的地址处添加断点。

– Peter Goodman
2014年11月28日0:32



感谢您的回答:)我的问题是,我希望使用可编写脚本的工作流程。当然,我可以寻找某种主电源,但这不一定存在。

–马夫
2014年11月28日上午10:06