如何 gdb 如何打印一个地址中的内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何 gdb 如何打印一个地址中的内容相关的知识,希望对你有一定的参考价值。

参考技术A gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式
x/ (n,f,u为可选参数)
n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义
f:显示格式
x(hex) 按十六进制格式显示变量。
d(decimal) 按十进制格式显示变量。
u(unsigned decimal) 按十进制格式显示无符号整型。
o(octal) 按八进制格式显示变量。
t(binary) 按二进制格式显示变量。
a(address) 按十六进制格式显示变量。
c(char) 按字符格式显示变量。
f(float) 按浮点数格式显示变量
u:每个单元的大小,按字节数来计算。默认是4 bytes。GDB会从指定内存地址开始读取指定字节,并把其当作一个值取出来,并使用格式f来显示本回答被提问者和网友采纳

如何在 gdb 中禁用程序集标签打印

【中文标题】如何在 gdb 中禁用程序集标签打印【英文标题】:How to disable assembly label printing in gdb 【发布时间】:2022-01-01 10:43:11 【问题描述】:

当我用x 检查内存时,我可以看到我正在读取的地址的符号:

(gdb) x/16zw &pt_table
0x102000 <pt_table>:    0x00000000  0x00000000  0x00000000  0x00000000
0x102010:    0x00000000 0x00000000  0x00000000  0x00000000

如何禁用标签的打印(或移动到自己的行)以正确对齐数据?我在手册上找不到任何内容。

例子:

(gdb) x/16zw &pt_table
0x102000: 0x00000000  0x00000000  0x00000000  0x00000000
0x102010: 0x00000000  0x00000000  0x00000000  0x00000000

或者:

(gdb) x/16zw &pt_table
<pt_table>:
0x102000: 0x00000000  0x00000000  0x00000000  0x00000000
0x102010: 0x00000000  0x00000000  0x00000000  0x00000000

【问题讨论】:

pipe x/16zw &amp;pt_table | sed 's/ &lt;.*&gt;//' 适合您吗?它可以放在用户定义的命令中,以便于键入。 谢谢,该解决方案会失去着色。 【参考方案1】:

如何禁用标签的打印(或移动到自己的行)以正确对齐数据?

我查看了当前的 GDB 源 (print_address_symbolic),没有任何方法可以禁止打印 symbolsymbol+offset

也许您想改用 LLDB。

(gdb) list 
1       int abc[100];
2       int main()  return abc[2]; 
(gdb) start
Temporary breakpoint 1 at 0x1129: file t.c, line 2.
Starting program: /tmp/a.out 

Temporary breakpoint 1, main () at t.c:2
2       int main()  return abc[2]; 

(gdb) x/8x &abc[1]
0x555555558064 <abc+4>: 0x00000000      0x00000000      0x00000000      0x00000000
0x555555558074 <abc+20>:        0x00000000      0x00000000      0x00000000      0x00000000

与 LLDB 比较:

(lldb) run 
Process 3645824 launched: '/tmp/a.out' (x86_64)
Process 3645824 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
    frame #0: 0x0000555555555129 a.out`main at t.c:2:24
   1    int abc[100];
-> 2    int main()  return abc[2]; 

(lldb) x/8x &abc[1]
0x555555558064: 0x00000000 0x00000000 0x00000000 0x00000000
0x555555558074: 0x00000000 0x00000000 0x00000000 0x00000000

【讨论】:

lldb 在某种程度上是 gdb 的“替代品”,还是它有自己的术语、配置等(如 vim/emacs)? | 编辑:这开始回答我的问题:gdb vs lldb 我使用dashboard .gdbinit UI 让我需要的一切一目了然。你知道(如果你使用类似的东西)LLDB 有类似的东西吗?

以上是关于如何 gdb 如何打印一个地址中的内容的主要内容,如果未能解决你的问题,请参考以下文章

从 GDB 中的列表中打印取消引用的值

如何在到达给定断点之前自动打印 GDB 中的每个执行行?

使用 GDB 在堆栈上打印符号

如何在 gdb 中禁用程序集标签打印

如何在gdb命令中打印输入和离开功能?

gdb 在相对于基地址的地址处打印符号