GDB Debug

  • 使用gdb带着参数启动程序

在gdb中启动程序并传递命令行参数:

gdb ./my_program  
(gdb) run arg1 arg2 arg3

这将在gdb中启动程序"my_program",并将参数"arg1"、"arg2"和"arg3"传递给程序。

在启动gdb之前,将参数存储在环境变量中,并在gdb中运行程序:

export MY_ARGS="arg1 arg2 arg3"  
gdb ./my_program  
(gdb) run $MY_ARGS

这将在gdb中启动程序"my_program",并将环境变量"MY_ARGS"中的参数传递给程序。

将参数存储在文件中,并在gdb中运行程序:

echo "arg1 arg2 arg3" > arguments.txt  
gdb ./my_program  
(gdb) run @arguments.txt

这将在gdb中启动程序"my_program",并将文件"arguments.txt"中的参数传递给程序。

gdb --args 命令用于指定要调试的程序的及其参数。该命令将程序和参数传递给 GDB(GNU Debugger),以便在调试会话中对其进行调试。以下是一个示例:

gdb --args program_name arg1 arg2 arg3

在上面的示例中,program_name 是要调试的程序的名称,arg1arg2 和 arg3 是程序的的可选参数。您可以在 gdb 命令后使用 --args 选项来指定程序和参数。在调试会话中,您可以使用其他 GDB 命令来检查和修改变量、观察程序执行流程等。

请注意,使用 --args 选项时,您需要确保在命令行中包含所有的程序参数,并且参数之间用空格分隔。如果参数包含空格或其他特殊字符,请使用引号将参数括起来。

例如,如果您的程序需要接受一个带引号的参数,您可以这样写:

gdb --args program_name "arg1 with quotes" arg2

这将把 "arg1 with quotes" 作为单个参数传递给程序,并将 arg2 作为另一个参数传递给程序。

注意,在使用这些方法时,您需要确保您的程序能够正确处理传递给它的参数。

  • gdb打印变量的值

print:打印变量的值。例如,print variable_name 将打印变量 variable_name 的值。

print /fmt variable_name:以指定的格式打印变量。fmt 可以是 f(十六进制浮点数)、o(八进制整数)、x(十六进制整数)或 d(十进制整数)。例如,print /f variable_name 将以浮点数格式打印变量 variable_name 的值。

  • gdb打印结构体变量或者结构体指针

打印结构体变量:

print struct_variable

这将打印结构体变量 struct_variable 的值。

打印结构体指针(或打印出结构体变量的所有成员):

print *struct_pointer

这将打印结构体指针 struct_pointer 所指向的结构体变量的值。

打印结构体指针的成员:

print struct_pointer->member_name

这将打印结构体指针 struct_pointer 所指向的结构体变量中成员 member_name 的值。

请注意,这些命令中的一些可能会因为所使用的GDB版本的不同而有所不同。如果您遇到问题,请参考GDB的文档或使用 help 命令获取更多帮助。

  • display 命令可以在 GDB 中显示变量的值。

可以使用以下语法

display variable_name

其中 variable_name 是您要显示的变量的名称。

例如,如果您要显示变量 x 的值,可以输入:

display x

每次程序停止时,GDB 将自动显示该变量的值。如果您想停止自动显示,可以使用 undisplay 命令。

此外,您还可以使用 display 命令显示表达式的值。例如:

display sizeof(int)

这将显示 int 类型的变量所占用的字节数。

display 命令与 print 命令类似,但它会自动显示变量的值,而不需要您每次手动输入。每次程序停止时,GDB 将自动显示该变量的值。如果您想停止自动显示,可以使用 undisplay 命令。

总的来说,print 命令用于手动显示变量的值,而 display 命令用于自动显示变量的值,特别是在调试会话期间经常使用。

在 GDB 的命令中,"/i" 选项用于以汇编格式显示指令。具体来说,它告诉 GDB 在显示指令时使用汇编语言。例如,使用 "x/i" 命令可以以汇编格式查看指定地址的指令。以下是一个示例:

(gdb) x/i 0x1234  
0x1234:    add    %eax,%eax

这将在地址 0x1234 上显示指令 "add %eax,%eax"。使用 "/i" 选项,GDB 会将指令以汇编语言形式显示,而不是以二进制形式显示。

display /i $pc :当用户想check 最后的崩溃点是,需要让栈处于 0号上下文, 然后输入该命令,

会显示出崩溃指令的内容(/20i, 以指令形式显示 pc指针及后续20行的汇编指令的内容)

(gdb) display /20i $pc

1: x/i $pc

=> 0x686042 : ldrb r3, [r7, r5]

... ...

再对应 info r 的输出结果,可以看到是什么数值最终引发了错误

  • gdb disassemble

disassemble 命令是 GDB(GNU Debugger)中的一个功能,用于显示当前函数的汇编代码。它可以将机器指令转换成易于阅读的汇编代码,以便于调试和分析程序。

要使用 disassemble 命令,您需要在 GDB 调试会话中进入您想要查看汇编代码的函数。然后,您可以输入 disassemble 或 dis 命令,再加上函数名称或函数地址。例如:

(gdb) disassemble main

这将显示函数 main 的汇编代码。您还可以使用函数地址来显示指定函数的汇编代码,例如:

(gdb) disassemble 0x1234

这将显示地址为 0x1234 的函数的汇编代码。

请注意,disassemble 命令可能因所使用的 GDB 版本而有所不同。如果您遇到问题,请参考 GDB 的文档或使用 help 命令获取更多帮助。

  • x 查看内存中的内容

x 命令是 GDB(GNU Debugger)中的一个命令,用于查看内存中的内容。该命令可以用于查看程序中的变量、数据和代码等。

x 命令的语法如下:

x/[N][SIZE] ADDRESS

其中,N 表示要查看的内存单元的数量,SIZE 表示每个内存单元的大小,ADDRESS 表示要查看的内存地址。

例如,要查看地址为 0x1234 的 4 个字节(一个整数)的值,可以输入:

x/i 0x1234

这将显示地址为 0x1234 的指令。

又如,要查看地址为 0x1234 的一个字(4 个字节)的值,可以输入:

x/4wx 0x1234

这将显示地址为 0x1234 的 4 个字(16 个字节)的值。

还可以使用 / 或 // 前缀来指定要查看的地址。例如,要查看地址为变量 x 的值,可以输入:

x/x &x

这将显示变量 x 的值。

  • display /i $pc:显示当前指令的汇编代码。其中,/i表示以汇编代码格式显示,$pc表示当前程序的计数器的值,也就是当前指令的地址。
  • x/x $pc:使用x命令查看当前指令的地址和汇编代码。其中,/x表示以十六进制格式显示,$pc表示当前程序计数器的值,也就是当前指令的地址。

你可能感兴趣的:(我的博客,linux,gdb)