如何在 GDB 中“重新加载”源文件

2023-12-23

里面有命令吗gdb我可以用它来(重新)加载/“刷新”源文件? (据我所知,gdb仅适用于源目录, 根据使用 GDB 调试:源代码 http://davis.lbl.gov/Manuals/GDB/gdb_8.html- 并且没有特定的“刷新”命令)

我的问题的背景:

我使用带有调试内核的虚拟机,因此我可以连接到本地实例gdb,并且可以调试内核模块。模块是在调试信息打开的情况下编译的,这指定了保存模块源的文件夹(指示GDB 6.5使用目标文件中嵌入的源代码 - VoidCC https://stackoverflow.com/questions/1579443/instruct-gdb-6-5-to-use-source-embedded-in-object-file)。我的源目录位于虚拟机和本地计算机的相同路径中。

问题是这样的 - 我需要执行相当多的步骤才能使模块出现段错误 - 并使远程 gdb 进入堆栈。然后我进行回溯,我可以看到引用的源文件,即

#0  0xc0132a13 in ?? ()
#1  0xc056e551 in ?? ()
#2  0xc056e506 in ?? ()
#3  0xd8be53f3 in mymodule_func1 (var1=0xd79f9b44, var2=0x0, var3=825269148)
    at /media/src/mymodule.h:954
#4  0xd8be53d0 in mymodule_func2 (data=3617561412)
    at /media/src/mymodule.h:936
#5  0xc014fe87 in ?? ()
#6  0xc0151478 in ?? ()

然后我试着说,list /media/src/mymodule.h:954- 我意识到我已经改变了本地版本的内容mymodule.h file!!

所以我撤消了更改 - 但不幸的是,GDB 没有看到这些更改!当然,我不想重新启动 GDB - 因为这意味着我必须重新启动 VM,并完成整个过程才能使内核模块再次出现段错误:(!!

然后我尝试做这样的事情:

(gdb) show symbol-reloading
Dynamic symbol table reloading multiple times in one run is off.
(gdb) set symbol-reloading on
(gdb) add-symbol-file ~/mymodule.o 0xd8be4000
add symbol table from file "/media/src/mymodule.o" at
    .text_addr = 0xd8be4000
(y or n) y
Reading symbols from /media/src/mymodule.o...done.

... in hope that it will somehow "reload" the source files - but unfortunately, list /media/src/mymodule.h:954 shows that it doesn't, nothing is changed - even though gdb does recognize that something has changed, as in warning: Source file is more recent than executable.... (so, for the time being, I have to restart entire VM and gdb as well :( :( )


使用以下命令重置目录列表directory http://davis.lbl.gov/Manuals/GDB/gdb_8.html#SEC49命令似乎达到了预期的效果。

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

如何在 GDB 中“重新加载”源文件 的相关文章

  • GDB/bin/bash 无法在 Eclipse CDT 中执行应用程序?

    在 Mac OS X Mojave 上使用 Eclipse CDT 运行 GDB 时遇到困难 当我尝试调试项目时 GDB 表现得很混乱 我能够调试几次 但随后它在下一个调试会话开始时开始停止 并显示消息 配置 GDB 可执行文件是 User
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • Visual Studio Code,调试子进程不起作用

    我有这个确切的问题 https github com Microsoft vscode cpptools issues 511 https github com Microsoft vscode cpptools issues 511 但那
  • gdb 中的 是什么意思?

    gdb n 134 a b c 0xdeadbeef uint32 t length initval gdb n gdb p a 30
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 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
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • gdb 声称它不知道如何运行

    我在 Mac Pro 上的 Mac OS X 10 6 6 上使用 Xcode 3 2 3 来构建 GrowlTunes 的修订版 5fd480ef577f咆哮开发存储库 http growl info hg growl developme
  • 为什么这段代码会死锁?

    我在可加载模块中创建了 2 个 Linux 内核线程 并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核 运行几次后 我注意到设备重新启动并重置了硬件看门狗定时器 我一直在解决这个问题 什么可能导致僵局 基本上 我需要做的
  • GDB - 将地址映射到源代码中的行和列

    gcc 和 clang 都有选项 gcolumn info 描述如下 将位置列信息发出到 DWARF 调试信息中 而不仅仅是文件和行 我已经使用此选项编译了我的二进制文件 现在我有一些指令的地址 想将其翻译回源文件 行号和列 有没有办法在g
  • 使用 math.h 函数时 gdb 给出奇怪的输出[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 gdb 将 sqrt 3 计算为 0 https stackoverflow com questions 5122570 why does gdb evaluate sqrt3 to 0 这里
  • 读取文件而不从操作系统页面缓存中逐出

    这主要适用于 Linux 或者理想情况下适用于任何 POSIX 系统 当我阅读以下页面时 我正在寻找一种读取大量文件 其中任何一个文件本身可能高达 1GB 的方法 具有以下特征 如果相关磁盘页面已在文件系统缓存中 则使用该页面 如果相关页面
  • 在 Linux 上,在 Eclipse CDT 中使用 gdb 调试 C++ 应用程序,如何向 stdin 输入内容?

    在 Linux 上 我尝试在 Eclipse CDT 中使用 gdb 调试 C 应用程序 例如应用程序applic exe接受一些命令行参数arg1 and arg2它期望一些数据stdin 比如说 取自文件input txt 通常 要在控
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom

随机推荐