0

我正在尝试在模拟器外壳中使用 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 (call to syscall 'exit_group'), 0xb7fe1424 in __kernel_vsyscall 是什么意思?

我进一步探索,我发现了这个

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

为什么不加载?

4

1 回答 1

1

该应用程序无法启动,我收到以下错误

您误会了:应用程序确实启动(并且您得到的输出不是错误),然后立即以0退出状态退出。

因此,您应该查看应用程序的问题,而不是 GDB 的问题。查看问题的一种方法是在_startand上设置断点main,并检查是否达到了这些函数中的任何一个。

如果是,则使用catch syscall exitcatch syscall exit_group可能会为您提供有关应用程序退出原因的线索。

也许您的应用程序采用了反逆向工程技术,并检测到它正在被调试?

更新:

您已验证应用程序实际上已启动,到达 main,然后调用exit. 现在你所要做的就是弄清楚它为什么调用exit。这样做的方法是找出exit_group系统调用的来源。

为此,您应该进入该系统调用 ( Catchpoint 4),发出 GDBwhere命令。这将告诉您您的应用程序如何决定退出。

您还(显然)在没有调试信息(通常是-g标志)的情况下构建了您的应用程序。如果您构建应用程序的调试版本,您将使调试更容易。

于 2013-04-10T14:00:28.440 回答