当前位置: 技术问答>linux和unix
gdb的疑问
来源: 互联网 发布时间:2016-10-21
本文导语: 代码片断如下 void InitCalcXorYx(USHORT *pCalcType,CALC_YX_FILE_XOR *pXorYx) {/* 功能:初始化异或遥信计算结构 参数:*pCalcType OUT 参与计算遥信类型 *pXorYx IN 异或计算遥信参数 返回:无 说...
代码片断如下
void InitCalcXorYx(USHORT *pCalcType,CALC_YX_FILE_XOR *pXorYx)
{/*
功能:初始化异或遥信计算结构
参数:*pCalcType OUT 参与计算遥信类型
*pXorYx IN 异或计算遥信参数
返回:无
说明:无
*/
1151 USHORT i;
1152 USHORT recNum=0,dYxNum=0,cellNum=0,sYxNum=0;
1153 USHORT sYxIndex=0,sYxNo=0,dYxIndex=0,dYxNo=0;
1154 USHORT yxSysDot=0,firstRecNo=0;
1155
1156 cellNum = GetCellNumber();
1157 /*单元数大于最大单元数出错,使用断言*/
1158 dYxIndex = pXorYx->comm.dCellIndex;
1159 if( dYxIndex >= cellNum )
1160 {
1161 printf("calc Xor yx configure error :nyx index = %d,cell Num = %dn",dYxIndex,cellNum);
1162 return;
1163 }
1164
1165 for(i=0;icomm.dCellIndex;
(gdb) print dYxIndex
$1 =
(gdb) print cellNum
$2 =
(gdb) next
1162 return;
(gdb) next
1159 if( dYxIndex >= cellNum )
(gdb) print dYxIndex
$3 = 6
(gdb) print cellNum
$4 =
(gdb) next
1156 cellNum = GetCellNumber();
(gdb)
1159 if( dYxIndex >= cellNum )
(gdb) print cellNum
$5 = 10
(gdb) print dYxIndex
$6 = 6
有几处疑问:(gdb)
问题1:对GetCellNumber()的调用怎么会是两次。
1156 cellNum = GetCellNumber();
(gdb)
GetCellNumber () at database.c:981
981 {
(gdb)
993 }
(gdb)
GetCellNumber () at database.c:981
981 {
(gdb)
993 }
问题2:为什么不能查看这两个变量的值,value optimized out是什么意思?
(gdb) print dYxIndex
$1 =
(gdb) print cellNum
$2 =
问题3:单步执行为什么会执行到1162行,为什么整个函数没有返回,而是又返回到1159行重新执行,之后又返回到1156行重新执行,并且最后执行成功。
(gdb) next
1162 return;
(gdb) next
1159 if( dYxIndex >= cellNum )
(gdb) print dYxIndex
$3 = 6
(gdb) print cellNum
$4 =
(gdb) next
1156 cellNum = GetCellNumber();
(gdb)
1159 if( dYxIndex >= cellNum )
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/apn172/archive/2010/11/29/6043624.aspx
void InitCalcXorYx(USHORT *pCalcType,CALC_YX_FILE_XOR *pXorYx)
{/*
功能:初始化异或遥信计算结构
参数:*pCalcType OUT 参与计算遥信类型
*pXorYx IN 异或计算遥信参数
返回:无
说明:无
*/
1151 USHORT i;
1152 USHORT recNum=0,dYxNum=0,cellNum=0,sYxNum=0;
1153 USHORT sYxIndex=0,sYxNo=0,dYxIndex=0,dYxNo=0;
1154 USHORT yxSysDot=0,firstRecNo=0;
1155
1156 cellNum = GetCellNumber();
1157 /*单元数大于最大单元数出错,使用断言*/
1158 dYxIndex = pXorYx->comm.dCellIndex;
1159 if( dYxIndex >= cellNum )
1160 {
1161 printf("calc Xor yx configure error :nyx index = %d,cell Num = %dn",dYxIndex,cellNum);
1162 return;
1163 }
1164
1165 for(i=0;icomm.dCellIndex;
(gdb) print dYxIndex
$1 =
(gdb) print cellNum
$2 =
(gdb) next
1162 return;
(gdb) next
1159 if( dYxIndex >= cellNum )
(gdb) print dYxIndex
$3 = 6
(gdb) print cellNum
$4 =
(gdb) next
1156 cellNum = GetCellNumber();
(gdb)
1159 if( dYxIndex >= cellNum )
(gdb) print cellNum
$5 = 10
(gdb) print dYxIndex
$6 = 6
有几处疑问:(gdb)
问题1:对GetCellNumber()的调用怎么会是两次。
1156 cellNum = GetCellNumber();
(gdb)
GetCellNumber () at database.c:981
981 {
(gdb)
993 }
(gdb)
GetCellNumber () at database.c:981
981 {
(gdb)
993 }
问题2:为什么不能查看这两个变量的值,value optimized out是什么意思?
(gdb) print dYxIndex
$1 =
(gdb) print cellNum
$2 =
问题3:单步执行为什么会执行到1162行,为什么整个函数没有返回,而是又返回到1159行重新执行,之后又返回到1156行重新执行,并且最后执行成功。
(gdb) next
1162 return;
(gdb) next
1159 if( dYxIndex >= cellNum )
(gdb) print dYxIndex
$3 = 6
(gdb) print cellNum
$4 =
(gdb) next
1156 cellNum = GetCellNumber();
(gdb)
1159 if( dYxIndex >= cellNum )
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/apn172/archive/2010/11/29/6043624.aspx
|
从现象来看,编译的时候好像是有优化。
LZ检查一下编译命令行的选项吧,不要用-O,而且一定要用-g
LZ检查一下编译命令行的选项吧,不要用-O,而且一定要用-g
|
调用多少次它怎么知道。这个主要是用来跟踪调试的