如何设置最早的断点 [英] How to set earliest possible breakpoint

查看:16
本文介绍了如何设置最早的断点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在模块加载到 gdb 后立即停止.假设二进制完全去掉了所有符号信息,所以没有main.

I'm trying to stop right after the module is loaded in gdb. Let's assume that the binary is completely stripped out of all symbol informations, so there's no main.

理想情况下,我会在入口点设置断点,但这个想法由于重定位而失效:

Ideally I'd set the breakpoint on the entry point, but that idea breaks down due to relocations:

(gdb) info target
Symbols from "./application".
Local exec file:
    `./application', file type elf64-x86-64.
    Entry point: 0xc154
...
(gdb) break *0xc154
Breakpoint 1 at 0xc154
(gdb) r
Starting program: ./application 
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0xc154: Input/output error.

(gdb) info target
Symbols from "./application".
Unix child process:
    Using the running image of child process 22835.
    While running this, GDB does not access memory from...
Local exec file:
    `./application', file type elf64-x86-64.
    Entry point: 0x555555560154

即使这种方法有效(我可以在新地址上设置一个新断点并禁用原始地址),它也不能通过 gdb 脚本/批处理模式轻松执行,因为它中间有一条失败的指令.

Even though that kind-of works (I could set a new breakpoint on the new address and disable the original), it cannot be easily executed via gdb script / batch mode, because it has a failing instruction in the middle.

有没有办法做到这一点?理想情况下,像运行单指令"而不是运行"这样的东西会很有用.

Is there a way to do that? Ideally something like "run single instruction", rather than "run" would be useful.

推荐答案

更新:

GDB-8.1 实现了 starti 命令,这让这变得非常简单.

GDB-8.1 implemented starti command, which makes this very easy.

入口点:0xc154

这是一个动态链接的、与位置无关的 (PIE) 二进制文件.

This is a dynamically-linked, position-independent (PIE) binary.

您希望在加载并重定位该二进制文件之后,但在它执行任何操作之前停止动态链接器.

You want to stop in the dynamic linker after that binary is loaded and relocated, but before it executed anything.

(gdb) set stop-on-solib-events 1
(gdb) run
Starting program: /tmp/a.out 
Stopped due to shared library event (no libraries added or removed)
(gdb) info target
Symbols from "/tmp/a.out".
Unix child process:
        Using the running image of child process 13746.
        While running this, GDB does not access memory from...
Local exec file:
        `/tmp/a.out', file type elf64-x86-64.
        Entry point: 0x5555555545f0
        ...

(gdb) bt
#0  __GI__dl_debug_state () at dl-debug.c:77
#1  0x00007ffff7ddd488 in dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=0x7ffff7ffe870) at rtld.c:1678
#2  0x00007ffff7defb24 in _dl_sysdep_start (start_argptr=<optimized out>, dl_main=0x7ffff7ddc6e0 <dl_main>) at ../elf/dl-sysdep.c:244
#3  0x00007ffff7ddf365 in _dl_start_final (arg=0x7fffffffe440) at rtld.c:338
#4  _dl_start (arg=0x7fffffffe440) at rtld.c:564
#5  0x00007ffff7ddb6b8 in _start () from /lib64/ld-linux-x86-64.so.2

这篇关于如何设置最早的断点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆