gdb 调试期间生成的新进程 ID

逆向工程 数据库
2021-06-14 08:25:01

我在 Ubntu 14 中调试了一个 ELF32 可执行文件,我在 main 中设置了 gdb 断点,单击运行后,程序生成一个新进程 13050 并退出,我无法使用信息寄存器显示值并继续调试。

这种情况怎么处理,谢谢


谢谢你的回复,让我详细说明一下,程序abc是ELF32文件,它当前作为进程10220运行,当我使用gdb abc时,break main,运行,它会自己杀死(进程10220)并生成一个新进程13050,这个新的 pid 具有另一个文件名 xyz。当我显示信息注册或反汇编时,每当我将follow-fork-mode设置为父或子时,它都会说gdb中不存在程序。有什么建议吗?

简而言之,abc 变成 xyz 并且 abc 被程序删除,有什么解决办法吗?

2个回答

在 linux 中创建新进程的常用方法(也是我所知道的唯一方法)是使用forkexec
当你 fork 进程时,你创建了一个带有新 pid 的当前进程的副本,它被传递给父进程(fork 调用者)——这就是你知道父进程和子进程是谁的方式。

要调试子进程,您可以按照 fork
请注意,您可以选择在 gdb 的控制下保持父级或子级暂停,但您只能使用相同的 gdb 实例调试其中之一。

它的用法将是(如链接所示):

set follow-fork-mode [parent/child]

父母=默认;您将继续调试父子项
= 您将开始调试子项

set detach-on-fork [on/off]

on = 分离你不调试的进程
off = 保持非调试进程在同一个 gdb 实例的控制下挂起

在新进程开始和第一个断点命中之间应该有一个小窗口。所以诀窍是用 shell 脚本收集新的 pid,将该pid提供给gdb命令文件,然后在窗口期间快速重复命令文件。

例如,您可以使用pidof获取程序pid

echo "attach $(pidof <program>)" > attach_pid

请注意,如果有一个已失效的进程pidof会选择它。

在 Unix shell 下,创建一个包含上述 Unix 命令的可执行文件。命名它attach.sh

接下来,定义一个gdb用户定义的命令:

define a
shell . ./attach.sh
source attach_pid
end

定义一个长命令名只会让你慢下来。

一切就绪后,触发程序,并在窗口中快速重新附加,只需点击a并按下Enter直到gdb附加到过程。请注意,回车将重复之前的命令并按住 Enter 键将很快生成快速重复的击键。另请注意,当尚未创建pidattach_pid仅包含"attach "并提供错误消息。