如何使用 LD_PRELOAD 运行 gdb?

2024-03-09

我有一个使用 LD_PRELOAD 的程序。该程序应该像这样运行 这个,“LD_PRELOAD=/path/to/libfoo.so qemu -U LD_PRELOAD a.out”,如果 没有 gdb。

这是我在运行 gdb 时所做的事情。

(gdb) set environment LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so

(gdb) file /nfs_home/chenwj/tools/bin/qemu-i386

(gdb) r -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1

但是 gdb 给了我下面的错误

Starting program: /nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1

bash: open "/bin/bash" failed: Permission denied

During startup program exited with code 66.

任何建议表示赞赏。

问候,陈维杰


GDB不直接调用您的可执行文件。相反,它确实

bash -c '/nfs_home/chenwj/tools/bin/qemu-i386  -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'

这样做是为了让 bash 负责 I/O 重定向(您没有使用它)。

我的猜测是/bin/bash当 LD_PRELOAD=libdbo.so 生效时不起作用,尽管我不明白失败的确切性质。

解决这个问题的一种方法是创建一个包装可执行文件,实现C相当于这个:

export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"

并调试该可执行文件(无需设置LD_PRELOAD)。你会看到一个额外的SIGTRAP当包装纸execve()是包裹的qemu-i386,你应该忽略它并且continue.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 LD_PRELOAD 运行 gdb? 的相关文章

  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • 如何在 gdb 中禁用“键入 继续,或 q 退出”?

    我想要自动化gdb 并且等待用户输入是不可取的 如何禁用消息 Type
  • 在 GDB 中显示结构体值

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • Yocto“无法运行 qemu:无法初始化 SDL(x11 不 > 可用)”

    所以我在本地构建服务器上安装了 Yocto 因为谁希望大规模构建占用他们的工作区 amirite 主机和服务器是Arch Linux 4 19 44 1 lts 无论如何 我只是从找到的快速构建页面运行示例here https www yo
  • gcc 中 -g 选项的作用是什么

    我看到很多关于 gdb 的教程要求在编译 c 程序时使用 g 选项 我无法理解 g 选项的实际作用 它使编译器将调试信息添加到生成的二进制文件中 此信息允许调试器将代码中的指令与源代码文件和行号相关联 拥有调试符号可以使某些类型的调试 例如
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 如何使 gdb 在反汇编模型上显示原始的非修改函数名称?

    void outputString const char str cout lt lt outputString const char str lt lt str lt lt endl 原来是 Dump of assembler code
  • 如何与 QEMU 映像共享主机的本地主机?

    想知道这样的事情是否可能 我有一个服务器在监听localhost 1889我的本地 PC 和 QEMU 映像能够使用相同的端口和 IP 访问服务器 localhost 1889 确实正在寻找以下解决方案之一 用于启用此功能的 QEMU 标志
  • 使用 GDB 远程调试 MPI

    我正在尝试从 pi 的远程访问组中调试我使用 MPI 编写的代码 我无法直接访问 Pi 以便能够使用 GUI 来调试代码 我已经尝试过使用屏幕显示的内容question https stackoverflow com questions 3
  • 如何在 VSCode 中配置调度程序锁定 gdb 选项

    我可以添加额外的参数launch json到 gdb 通过miDebuggerArgs https code visualstudio com docs cpp launch json reference midebuggerargs 像这
  • GDB 脚本编写为 MOCK

    我正在尝试使用 GDB 模拟一个函数 用于单元测试父函数 一种方法是在您想要模拟和使用 GDB 的函数中设置一个断点return命令 但是当 GDB 时我无法做同样的事情call使用命令 gdb b secret check Breakpo
  • Android Studio 模拟器:错误:检测到挂起线程 QEMU2 主循环

    我在 Ubuntu 16 04 上使用 Android Studio 3 0 1 昨天 Android Studio 弹出一条消息 说有可用更新 我总是点击这些更新 然后它通知我它已成功更新模拟器 我的 AVD 之前工作得很好 但更新完成后
  • gdb:显示一些数据的类型信息

    基本上 我想得到typeid this name 即真实类型this 我想在GDB中得到这个 不修改源代码 我试过print typeid this 但它说typeid未知 因为我没有将其包含在源文件中 Use ptype命令 像这样 gd
  • 为什么Android模拟器这么慢?我们怎样才能加快Android模拟器的速度呢?

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我有一个2 67GHz 赛扬处理器 以及1 21GB RAM 上x86视窗XP专业机器 我的理解是安卓模拟器在这样的机器上应该
  • 从 gdb 设置 std::string 变量值?

    是否有可能 当调试器在断点处停止时 修改 std string 变量的值 而不需要采取诸如调整当前缓冲区的内存映像之类的黑客手段 例如类似于 set var mystring hello world 试试这个 经过测试并且对我有用 call
  • 在 GDB 中,如何将 'exec-wrapper env' 设置为多个环境变量?

    在 GDB 中 您可以使用以下命令设置进程的环境变量set exec wrapper env MYENVVAR 这很好用 但我不确定如何设置多个 是否必须使用某种分隔符 我想同时设置LD PRELOAD and LD LIBRARY PAT

随机推荐