我正在尝试在模拟器shell中使用gdb运行应用程序。我使用以下命令
gdb <path of exe>
然而,该应用程序未启动,我收到以下错误
Starting program: <path of exe>
[Thread debugging using libthread_db enabled]
Program exited normally.
但是,当我将正在运行的进程附加到gdb时,它可以正常工作。
gdb -pid <process_id>
可能是什么原因?
****<Update>****
On Employed Russian's advice, I did these steps
(gdb) b _start
Breakpoint 1 at 0xb40
(gdb) b main
Breakpoint 2 at 0xc43
(gdb) catch syscall exit
Catchpoint 3 (syscall 'exit' [1])
(gdb) catch syscall exit_group
Catchpoint 4 (syscall 'exit_group' [252])
(gdb) r
Starting program: <Exe Path>
[Thread debugging using libthread_db enabled]
Breakpoint 1, 0x80000b40 in _start ()
(gdb) c
Continuing.
Breakpoint 2, 0x80000c43 in main ()
(gdb) c
Continuing.
Catchpoint 4 (call to syscall 'exit_group'), 0xb7fe1424 in __kernel_vsyscall
()
(gdb) c
Continuing.
Program exited normally.
(gdb)
Catchpoint 4(调用系统调用'exit_group'),__ kernel_vsyscall中的0xb7fe1424 这意味着什么?
我进一步探索了,我发现了这个
Single stepping until exit from function main,
which has no line number information.
__libc_start_main (main=0xb6deb030 <main>, argc=1, ubp_av=0xbffffce4,
init=0x80037ab0 <__libc_csu_init>, fini=0x80037b10 <__libc_csu_fini>,
rtld_fini=0xb7ff1000 <_dl_fini>, stack_end=0xbffffcdc) at libc-start.c:258
258 libc-start.c: No such file or directory.
in libc-start.c
但是,libc.so存在,我也使用
导出了它的路径export LD_LIBRARY=$LD_LIBRARY:/lib
为什么不加载?
答案 0 :(得分:1)
该应用无法启动,我收到以下错误
您错了:应用执行启动(并且您获得的输出不错误),然后立即以0
退出状态退出。
因此,您应该查看应用程序的问题,而不是GDB的问题。查看问题的一种方法是在_start
和main
上设置断点,并检查是否已达到这些功能之一。
如果是,使用catch syscall exit
或catch syscall exit_group
可能会为您提供应用程序退出原因的线索。
也许您的应用程序采用反逆向工程技术,并检测到它正在被调试?
更新
您已经确认应用程序实际上已启动,到达main,然后调用exit
。现在你所要做的就是找出为什么它调用exit。这样做的方法是找出exit_group
系统调用的来源。
要做到这一点,你应该进行系统调用(Catchpoint 4
),发出GDB where
命令。这将告诉您应用程序如何决定退出。
您(显然)也没有调试信息(通常为-g
标志)构建您的应用程序。如果构建应用程序的调试版本,则可以使调试更容易。