我希望 lldb 在 OS X 应用程序的实际代码开始时中断(如果符号存在,则可能称为main)。
我目前正在手动查找,但由于我想编写一些操作脚本,如果这可以以某种方式自动实现,那就太好了
你有什么想法吗?
我希望 lldb 在 OS X 应用程序的实际代码开始时中断(如果符号存在,则可能称为main)。
我目前正在手动查找,但由于我想编写一些操作脚本,如果这可以以某种方式自动实现,那就太好了
你有什么想法吗?
试试这个:
(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)
尝试在错误地址上添加断点。在 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