每天学点GDB(二)

    xiaoxiao2026-02-17  15

    <一>如何让将调试的内容保存到外部文件里面

    在上一篇提及如何在断点处打印调试信息后,程序自动继续执行。本节主要讲述如何让将调试的内容保存到外部文件里面。

    默认情况下,日志是没有打开的,所有的调试信息都会在屏幕中显示,即默认是输出到stdout中的。那么有没有可能将输出到屏幕中的内容保存到文件里呢。答案自然是肯定的,这里面有个地方遇要注意一下子,具体会在下面的示例中提及。

    将日志文件打开,不指定文件名的话,默认的文件名是gdb.txt。

    gdb)set logging on

    查看更多有关logging设置相关的帮助,可以用如下的指令。

    gdb)help set logging

    在设置日志的时候,有一点需要注意,如果日志输出过长,导致滚屏发生的话。程序会停下来等待人工干预,这样在上一节中使用commands的目的就无法实现。

    为了抑止滚屏时人工干预,需要输入如下指令。

    gdb)set pagination off

    在本节最后提及的是在gdb中环境中执行shell里的指令,如gdb的输出内容过多,准备调用clear来清屏。

    gdb)shell clear

    如果源代码发生变化了,想在gdb中直接调用相关指令进行编译。

    gdb)shell gcc -o hello -g hello.c

    将最新的目标文件再次载入到gdb

    gdb)file hello

    <二>如何用各种方法查看变量的值

    本节侧重于如何用各种方法查看变量的值。

    #include <stdlib.h> #include <stdio.h> void show_slogan(char* slogan); int counter; char* welcome_msg = "you are welcome!"; int main(int argc, char** argv) { int i = 0; counter = 0; show_slogan(welcome_msg); return 0; } void show_slogan(char* slogan) { printf("%s\n",slogan); counter++; printf("you'); }

    编译

    gcc -o test -g test.c

    启动gdb

    gdb test

    gdb)br 10

    gdb)r

    程序运行至断点1,即行10

    显示局部变量的值

    gdb)info loal

    i = 10

    打印i的地址

    gdb)p &i

    $1 = (int *) 0x7fffffffe7cc

    因为作者当前是64位cpu,故显示为64位指针

    有了指针,就可以使用大杀器"x"

    多费一句话,在gdb中,查看内存中到底放置了哪些东西关键的关键就是要学会使用x并理解其输出内容中的具体含义。

    gdb)x 0x7fffffffe7cc

    显示当前指针中包含的值,与p i的效果相同。

    如果上述i的例子不能让你有较深印象的话,那么就用welcome_msg来说明问题中。

    gdb)p welcome_msg

    $5 = 0x400664 "you are welcome!"

    现在有了welcome_msg的指针,有x来打印内容

    gdb)x/s 0x400664

    0x400664:"you are welcome!"

    想到byte级别,好的使用修饰符c

    gdb)x/16c 0x400664

    0x400664: 121 'y' 111 'o' 117 'u' 32 ' ' 97 'a' 114 'r' 101 'e' 32 ' ' 0x40066c:   119 'w' 101 'e' 108 'l' 99 'c'  111 'o' 109 'm' 101 'e' 33 '!

     想来welcome_msg的例子可以让你切身体会到x的强大之处。

    x后可以跟多种修饰符

    显示x的帮助信息

    gdb) help x

    好了,今天的主要内容就是介绍赫赫有名的x.用好x就可以让内存中的内容无所遁形。

    相关资源:python入门教程(PDF版)
    最新回复(0)