当前位置: 技术问答>linux和unix
gdb下如何打印bool变量的 value ? 谢谢
来源: 互联网 发布时间:2016-06-03
本文导语: 假设有结构体 info struct info{ int age; bool isgood; }; 当前断点有变量 info in; 如何打印in.isgood ?? 谢谢 | info locals | gdb对断点的处理 (1) 断点功能的实现就是...
假设有结构体 info
struct info{
int age;
bool isgood;
};
当前断点有变量 info in;
如何打印in.isgood ??
谢谢
struct info{
int age;
bool isgood;
};
当前断点有变量 info in;
如何打印in.isgood ??
谢谢
|
info locals
|
gdb对断点的处理 (1)
断点功能的实现就是在指定位置插入断点指令,使目标程序运行至该处时产生SIGTRAP信号,该信号被gdb捕获,通过断点地址的匹配确定是否命中断点。
断点的属性:
是否有条件(由condition命令修改);
是否有忽略次数 (由ignore命令修改);
是否只针对某个线程有效(由break命令的thread参数指定);
是否是临时断点(由tbreak命令插入)。
gdb对断点的处理 (2)
断点命中的判定:目标程序遇到断点,并不一定就需要停下来,该停就停,不该停的还是要继续跑。只有真正需要停止运行的情况才认为是断点命中。是否命中断点的判定因素主要有以下这些:
导致目标程序本次停止运行的信号是不是SIGTRAP;
在gdb维护的断点链表中是否存在一个断点的地址与目标程序本次停止位置匹配;
若断点存在条件,此时条件是否满足;
断点的忽略次数此时是否为0;
若断点只针对某个线程有效,那么遇到该断点的线程是否就是断点所设定的线程;
若前两个条件之一不满足,则认为目标程序本次是因随机信号而停止。若后三个条件之一不满足,则认为目标程序本次没有命中断点,gdb会让其继续运行。
gdb对断点的处理 (3)
临时断点 – 断点命中之后的处理。当判定为断点命中之后,若该断点为临时断点,gdb就会将这个断点删除。也就是说,临时断点只命中一次。可能用到临时断点的场合:
用户通过tbreak命令显式插入;
next、nexti、step命令需要跨越函数调用的时候,由gdb自动在函数返回地址处插入临时断点;
finish命令需要在当前函数返回地址处插入临时断点;
带参数的until命令需要在当前函数返回地址以及参数指定地址插入临时断点;
在不支持硬件单步的架构上,gdb需要逐指令插入临时断点来实现软件单步;
gdb对断点的处理 (4)
gdb将断点实际插入目标程序的时机:当用户通过break命令设置一个断点时,这个断点并不会立即生效,因为gdb此时只是在内部的断点链表中为这个断点新创建了一个节点而已。gdb会在用户下次发出继续目标程序运行的命令时,将所有断点插入目标程序,新设置的断点到这个时候才会实际存在于目标程序中。与此相呼应,当目标程序停止时,gdb会将所有断点暂时从目标程序中清除。
断点命中失败的情况下,跨越断点继续运行的过程:
清除断点
单步到断点的下一条指令
恢复断点
继续目标程序运行
断点功能的实现就是在指定位置插入断点指令,使目标程序运行至该处时产生SIGTRAP信号,该信号被gdb捕获,通过断点地址的匹配确定是否命中断点。
断点的属性:
是否有条件(由condition命令修改);
是否有忽略次数 (由ignore命令修改);
是否只针对某个线程有效(由break命令的thread参数指定);
是否是临时断点(由tbreak命令插入)。
gdb对断点的处理 (2)
断点命中的判定:目标程序遇到断点,并不一定就需要停下来,该停就停,不该停的还是要继续跑。只有真正需要停止运行的情况才认为是断点命中。是否命中断点的判定因素主要有以下这些:
导致目标程序本次停止运行的信号是不是SIGTRAP;
在gdb维护的断点链表中是否存在一个断点的地址与目标程序本次停止位置匹配;
若断点存在条件,此时条件是否满足;
断点的忽略次数此时是否为0;
若断点只针对某个线程有效,那么遇到该断点的线程是否就是断点所设定的线程;
若前两个条件之一不满足,则认为目标程序本次是因随机信号而停止。若后三个条件之一不满足,则认为目标程序本次没有命中断点,gdb会让其继续运行。
gdb对断点的处理 (3)
临时断点 – 断点命中之后的处理。当判定为断点命中之后,若该断点为临时断点,gdb就会将这个断点删除。也就是说,临时断点只命中一次。可能用到临时断点的场合:
用户通过tbreak命令显式插入;
next、nexti、step命令需要跨越函数调用的时候,由gdb自动在函数返回地址处插入临时断点;
finish命令需要在当前函数返回地址处插入临时断点;
带参数的until命令需要在当前函数返回地址以及参数指定地址插入临时断点;
在不支持硬件单步的架构上,gdb需要逐指令插入临时断点来实现软件单步;
gdb对断点的处理 (4)
gdb将断点实际插入目标程序的时机:当用户通过break命令设置一个断点时,这个断点并不会立即生效,因为gdb此时只是在内部的断点链表中为这个断点新创建了一个节点而已。gdb会在用户下次发出继续目标程序运行的命令时,将所有断点插入目标程序,新设置的断点到这个时候才会实际存在于目标程序中。与此相呼应,当目标程序停止时,gdb会将所有断点暂时从目标程序中清除。
断点命中失败的情况下,跨越断点继续运行的过程:
清除断点
单步到断点的下一条指令
恢复断点
继续目标程序运行
|
[root][~]# g++ -g -o cpptest cpptest.cpp fun.cpp
[root][~]# gdb -q cpptest
(gdb) l
1 #include "fun.h"
2
3 #include
4 using namespace std;
5
6
7 int main(){
8
9 int j = 12;
10
(gdb)
11 for( int i=0; i
[root][~]# gdb -q cpptest
(gdb) l
1 #include "fun.h"
2
3 #include
4 using namespace std;
5
6
7 int main(){
8
9 int j = 12;
10
(gdb)
11 for( int i=0; i