- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如!ls
将执行ls
gdb 本身中有命令,但如何在远程端执行此操作?
应该很简单,但我不明白。 Per documentation类似 target remote | ls
或target remote | !ls
应该可以解决这个问题,但要么它是错误的,要么我不明白一些东西:这样的命令使 gdb 尝试关闭当前 session ,并开始调试 ls
二进制。
我还发现了一些monitor cmd
提到过,但是 monitor !ls
只是触发Unknown monitor command
消息。
最佳答案
解决方法是实现执行以下操作的自定义 gdb 命令:
有几个限制需要考虑:
call
命令上无法解析符号:我们需要通过地址调用 libc 函数,这需要预先加载地址;call
命令执行的 Shell 命令输出不会在 gdb 终端中回显:但是,我们可以将其捕获到远程临时文件中,然后读取到内存并打印。gdb session 示例:
# Given remote terminal running `gdbserver :2345 ./remote_executable`, we connect to that server.
target extended-remote 192.168.1.4:2345
# Load our custom gdb command `rcmd`.
source ./remote-cmd.py
# Run until a point where libc has been loaded on the remote process, e.g. start of main().
b main
r
# Don't need the main() breakpoint anymore.
del 1
# Run the remote command, e.g. `ls`.
rcmd ls
远程cmd.py:
#!/usr/bin/env python3
import gdb
import re
import traceback
import uuid
class RemoteCmd(gdb.Command):
def __init__(self):
self.addresses = {}
self.tmp_file = f'/tmp/{uuid.uuid4().hex}'
gdb.write(f"Using tmp output file: {self.tmp_file}.\n")
gdb.execute("set detach-on-fork off")
gdb.execute("set follow-fork-mode parent")
gdb.execute("set max-value-size unlimited")
gdb.execute("set pagination off")
gdb.execute("set print elements 0")
gdb.execute("set print repeats 0")
super(RemoteCmd, self).__init__("rcmd", gdb.COMMAND_USER)
def preload(self):
for symbol in [
"close",
"execl",
"fork",
"free",
"lseek",
"malloc",
"open",
"read",
]:
self.load(symbol)
def load(self, symbol):
if symbol not in self.addresses:
address_string = gdb.execute(f"info address {symbol}", to_string=True)
match = re.match(
f'Symbol "{symbol}" is at ([0-9a-fx]+) .*', address_string, re.IGNORECASE
)
if match and len(match.groups()) > 0:
self.addresses[symbol] = match.groups()[0]
else:
raise RuntimeError(f'Could not retrieve address for symbol "{symbol}".')
return self.addresses[symbol]
def output(self):
# From `fcntl-linux.h`
O_RDONLY = 0
gdb.execute(
f'set $fd = (int){self.load("open")}("{self.tmp_file}", {O_RDONLY})'
)
# From `stdio.h`
SEEK_SET = 0
SEEK_END = 2
gdb.execute(f'set $len = (int){self.load("lseek")}($fd, 0, {SEEK_END})')
gdb.execute(f'call (int){self.load("lseek")}($fd, 0, {SEEK_SET})')
if int(gdb.convenience_variable("len")) <= 0:
gdb.write("No output was captured.")
return
gdb.execute(f'set $mem = (void*){self.load("malloc")}($len)')
gdb.execute(f'call (int){self.load("read")}($fd, $mem, $len)')
gdb.execute('printf "%s\\n", (char*) $mem')
gdb.execute(f'call (int){self.load("close")}($fd)')
gdb.execute(f'call (int){self.load("free")}($mem)')
def invoke(self, arg, from_tty):
try:
self.preload()
is_auto_solib_add = gdb.parameter("auto-solib-add")
gdb.execute("set auto-solib-add off")
parent_inferior = gdb.selected_inferior()
gdb.execute(f'set $child_pid = (int){self.load("fork")}()')
child_pid = gdb.convenience_variable("child_pid")
child_inferior = list(
filter(lambda x: x.pid == child_pid, gdb.inferiors())
)[0]
gdb.execute(f"inferior {child_inferior.num}")
try:
gdb.execute(
f'call (int){self.load("execl")}("/bin/sh", "sh", "-c", "exec {arg} >{self.tmp_file} 2>&1", (char*)0)'
)
except gdb.error as e:
if (
"The program being debugged exited while in a function called from GDB"
in str(e)
):
pass
else:
raise e
finally:
gdb.execute(f"inferior {parent_inferior.num}")
gdb.execute(f"remove-inferiors {child_inferior.num}")
self.output()
except Exception as e:
gdb.write("".join(traceback.TracebackException.from_exception(e).format()))
raise e
finally:
gdb.execute(f'set auto-solib-add {"on" if is_auto_solib_add else "off"}')
RemoteCmd()
关于shell - gdbserver:执行目标的shell命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757055/
环境是: target:x86_64 client,运行 strip 化的程序 主机:x86_64服务器,有代码,工具链, strip 程序,用于调试的符号文件 在目标上运行 gdbserver: %
我为 arm 编译了 gdbserver 7.6: cd /gdb-7.6-src/gdb/gdbserver ./configure --target=arm-linux --host=arm-li
我正在尝试使用 gdbserver... 我有一个应用程序,其二进制路径 /user/bin/foo 与 pid 19767 一起运行。 远程启动 gdbserver: gdbserver --re
我有一个 ARM 设备,我想调试它。我的主机是 Linux 12.04,我使用的是 Eclipse。GDBServer 在我的目标设备上运行。 我可以调试单进程应用程序。但是当我想调试包含 pthre
例如!ls将执行ls gdb 本身中有命令,但如何在远程端执行此操作? 应该很简单,但我不明白。 Per documentation类似 target remote | ls或target remot
我正在尝试在 Android (Java/C/C++) 上调试混合代码。我的目标设备是 Vizio 1008。代码在模拟器上运行,我可以使用 GDB 从 Eclipse 调试它。但是,我无法在真实设备
我正在调试在远程目标上的 Linux 环境中运行的嵌入式应用程序。该板唯一可用的接口(interface)是一个串行接口(interface)。现在它在 init 上连接了/bin/sh。我正在连接
我正在尝试使用 gdbserver 进行调试。在我终止主机上的 gdb 客户端后,我看到 gdbserver 仍在监听: Remote side has terminated connection.
我尝试如下远程使用gdbserver进行调试 在目标机器上启动gdbserver $ gdbserver localhost:2000 hello -l 20 -b 10 --enable-targe
我正在使用 Eclipse CDT 和 GNU ARM QEMU 模拟器。 Eclipse 使用 QEMU 上运行的 gdbserver 启动自己的 gdb session 。我还希望能够从 OSX
我试图交叉编译OpenWrt-RTK gdb/gdbserver软件包,我在make menuconfig中选择了gdbserver并执行了make V=s,但我无法编译它,我收到了此错误 ../si
我正在 eclipse CodeSourcery IDE 中调试 C 项目。该项目在 linux-arm 设备中运行,因此我使用 gdbserver 交叉编译和调试它。我的项目由一个主程序和一些共享库
我正在使用 gdbserver 调试远程进程。我可以在 gdbserver 启动并等待输入后将其附加到该进程。 但是,我想在启动时将 gdbserver 附加到该进程。该进程是通过 shell 脚本启
我正在尝试调试远程主机上的 fork 进程,但每次都让 gdbserver 进程在子退出时结束。 尝试在 .gdbinit 中设置“set follow-fork-mode child”,没有帮助。
我在 Netbeans 中使用 gdbserver 插件试图连接到远程调试 session 。但是我收到一个错误:“设备的 ioctl 不合适。”我可以通过从终端启动 gdb 进行远程调试,但我希望能
1) 我通过 gdb myAppName 在远程计算机上启动 GDB 2) 然后我给出 run -p portNumber 3)然后我运行java应用程序并在上述端口上与其连接。 现在,当我尝试通过
我想在arm-Linux开发板上使用gdb调试。编译 gdbserver 时出错。 主机:Ubuntu 11 32 位目标:arm-linux-gcc(gcc版本4.4.3) root@mickeyv
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
当从运行 gdb 的主机发送 step 命令到运行 gdb 服务器的远程目标(通过 TCP/IP 连接)时,我在目标上收到以下错误 ptrace: Input/output error. input_
我有一个程序出现段错误。我需要远程调试它。为此,我正在执行以下操作: 在目标板上: #gdbserver :2345 program 在 x86 主机上: $ arm-linux-gdb -q pro
我是一名优秀的程序员,十分优秀!