b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

gdb 条件断点_gdb watch_gdb 条件断点 内存(11)

电脑杂谈  发布时间:2017-04-10 23:05:12  来源:网络整理

表达式的语法应该是当前所调试的语言的语法,由于C/C是一种大众型的语言,所以,本文中的例子都是关于C/C的。(而关于用GDB调试其它语言的章节,我将在后面介绍)

在表达式中,有几种GDB所支持的操作符,它们可以用在任何一种语言中。

@

是一个和数组有关的操作符,在后面会有更详细的说明。

::

指定一个在文件或是一个函数中的变量。

{<type>} <addr>

表示一个指向内存地址<addr>的类型为type的一个对象。

二、程序变量

在GDB中,你可以随时查看以下三种变量的:

1、全局变量(所有文件可见的)

2、静态全局变量(当前文件可见的)

3、局部变量(当前Scope可见的)

如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量,也就是说,如果一个全局变量和一个函数中的局部变量同名时,如果当前停止点在函数中,用print显示出的变量的会是函数中的局部变量的。如果此时你想查看全局变量的时,你可以使用“ :: ”操作符:

file::variable

function::variable

可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的:

gdb) p 'f2.c'::x

当然,“ :: ”操作符会和C中的发生冲突,GDB能自动识别“ :: ”是否C的操作符,所以你不必担心在调试C程序时会出现异常。

另外,需要注意的是,如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取错误码的情况。这个是很正常的,因为优化程序会删改你的程序,整理你程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指令就有不一样,也就会出现你所想象不到的结果。对付这种情况时,需要在编译程序时关闭编译优化。一般来说,几乎所有的编译器都支持编译优化的开关,例如,GNU的C/C编译器GCC,你可以使用“ -gstabs ”选项来解决这个问题。关于编译器的参数,还请查看编译器的使用说明文档。

三、数组

有时候,你需要查看一段连续的内存空间的。比如数组的一段,或是动态分配的数据的大小。gdb 条件断点你可以使用GDB的“ @ ”操作符,“ @ ”的左边是第一个内存的地址的,“ @ ”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

int *array = (int *) malloc (len * sizeof (int));

于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取:

p *array@len

@的左边是数组的首地址的,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大约是下面这个样子的:

(gdb) p *array@len

$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}

如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。

四、输出式


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-40593-11.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...