gcc默认编译的时候,gdb调试过程中是不能看到宏定义的,"p 宏名" 会显示错误,如下: (gdb) p CLIENT6_BEGIN_FLG No symbol "CLIENT6_BEGIN_FLG" in current context. (gdb) 其中#define CLIENT6_BEGIN_FLG "<Client6>" 这样gdb调试过程中就很不直观,尤其是很多大型程序中,宏定义比较复杂的时候。 如果需要...
(gdb) info register 通过disassemble /m main来将源码和汇编一起显示,ni执行下一条汇编指令.info register来显示汇编信息,core 的位置的指令为:0x0000000000400676 <+57>: movb $0x1,(%rax)将 1 赋值给 rax 寄存器保存的地址, 我们可以看下 rax 寄存器,p $rax直接打印,然后通过x /x 0x12345来测试下这个...
在GDB下, 我们无法print宏定义,因为宏是预编译的。 但是我们还是有办法来调试宏,这个需要GCC的配合。 在GCC编译程序的时候,加上 -ggdb3参数,这样,你就可以调试宏了。 另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。 info macro 查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。 macro 查看宏...
gcc -g fg.c -o fg、gcc -g3 fg.c -o fg 编译时还需要加上-g选项让编译生成的可执行文件中包含足够的调试信息,包含代码、栈、局部变量等,若还需查看更多信息如宏定义则需添加-g3选项,这样就可以通过print命令打印宏定义信息。 测试如下:编译进入调试界面 编译进入调试界面 调试界面 3基本常用命令:(以下...
p 命令表示 打印值. n表示过程调试, 到下一步. 不管子过程如何都不进入. 直接一次跳过. 上面用的s 表示单步调试, 遇到子函数,会进入函数内部调试. 总结一下 .l 查看源码 , b 加断点, r 开始运行调试, n 下一步, s下一步但是会进入子函数. p 输出数据. ...
宏定义 .h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。 对于宏定义,在gdb调试中值一般不可见,在编译时加入-gdwarf-2 -g3参数,可使宏定义的值可查看。 gcc -g -gdwarf-2 -g3 test.c -o test 将宏定义加进去编译 ...
long ptrace(request,pid_t pid, void *addr, void *data)request:宏定义,比如说PTRACE_TRACEME, ...
先在shm_zone->init = NULL;代码所对应的第1318行先下一个Breakpoint,执行Nginx后将在此处暂停程序,通过p指令打印获取shm_zone->init的地址值,然后直接给shm_zone->init对应的地址下个Watchpoint进行监视。这样即便是跑出shm_zone->init变量所在的作用域也没有关系,执行c命令继续执行Nginx,一旦shm_zone->init被...
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。 p 变量:打印变量值。 set var:修改变量的值。 continue(或c):从当前位置开始连续而非单步执行程序。 run(或r):从开始连续而非单步执行程序。 delete breakpoints:删除所有断点。 delete breakpoints n:删除序号为n的断点。
-D name=definition //加入宏定义,若不指定def,则默认为1 -O1、-O2 //规定编译器的优化等级,优化级数越高执行效率一般越好,但是优化会改变原有程序结构,使得其汇编不易理解 //一些进行缓冲区溢出实验时可能需要的选项 -fstack-protector-fno-stack-protector //是否开启堆栈保护,这里的保护是在返回地址之前加入一...