objects=GPS.o Initial.o Src.o Wal.o Psh.o FOPO.o AddNoise.o
edit:$(objects)
g++ -o edit $(objects) -lm
GPS.o:GPS.h
g++ -c -g GPS.cpp
Initial.o:GPS.h
g++ -c -g Initial.cpp
Src.o:GPS.h
g++ -c -g Src.cpp
Wal.o:GPS.h
g++ -c -g Wal.cpp
Psh.o:GPS.h
g++ -c -g Psh.cpp
FOPO.o:GPS.h
g++ -c -g FOPO.cpp
AddNoise.o:GPS.h
g++ -c -g AddNoise.cpp
.PHONY : clean
clean :
rm edit $(objects)
首先用make命令生成.o文件,然后进入gdb中调试,这里GPS.cpp是主程序;为什么当用“gdb GPS”时总是提示“Undefined command: "GPS"”
13 个解决方案
#1
gdb 和 makefile有什么关系?你的GPS 是什么?先试着调 helloworld 吧
#2
是这样的,我准备用C++语言实现完整的GPS通信系统,操作系统是linux,自己把所有的cpp文件都放在同一个文件夹GPS_cpp中。由于系统模块(.cpp文件)很多,为了编译方便,于是写了一个Makefile文件在终端进行整体编译;编译通过后想对程序各个模块进行调试,查看各个输出结果是否正确。经网上查阅可以直接对Makefile文件进行修改方便gdb调试(比如在每个源文件.cpp前面添加-g命令等),命令“gdb GPS”中的GPS是主程序的名字。现在出现了上面的问题,请问我该怎么修改
#3
g++ -o edit $(objects) -lm
没有 GPS
没有 GPS
#4
好像不对,
我准备采用gdb进行调试,你这是编译命令,不是调试吧。
#5
我是参照这个来的,http://blog.sina.com.cn/s/blog_59f549a20101j1fh.html
#6
你生成的文件名不叫 gps,你调试 gps 什么啊
#7
的确如你所说,我最后生成的是edit可执行文件,采用gdb edit命令后可以进入调试啦,多谢啦!不过在单步调试时发现程序语句的执行顺序和自己预期的不一样,变量值也不一样,网上说可能是开启了优化导致的,可我的Makefile中没有开启任何优项,如下图
#8
g++ -ggdb -Wall -c GPS.cpp
也可能代码本身就有问题
也可能代码本身就有问题
#9
好像还是不行。
仔细调试了下代码,调试过程是这样的。进入gdb调试状态后首先list出主函数前面部分代码
上图是主函数的部分代码,其中的wal和psh分别是2个子函数。开始断点调试,这里在psh函数入口设置断点。
psh子函数前面部分代码如下:
#include"GPS.h"
void psh(short *pIn,long int InLen,double *pOut,long int *OutLen)
{
int j;
long int i;
double Temp;
// double zeros[gPsh_Rank-1];
// double *pPsh;
//static double *pPsh=(double *)malloc(Len*sizeof(double));
static short PshTemp[gPsh_Rank-1];
static short *pOutTemp;
if(gFirstPshFlag)
{
pOutTemp=(short *)malloc((Psh_OutLen+gPsh_Rank-1)*sizeof(short));
gFirstPshFlag=0;
}
在断点调试进入到psh子函数中,用n命令单步调试,如下
结果可以看出
{
pOutTemp=(short *)malloc((Psh_OutLen+gPsh_Rank-1)*sizeof(short));
gFirstPshFlag=0;
}
中的malloc()语句没有被执行。
这里Psh_OutLen是在头文件“GPS.h”(psh源文件包含该头文件)中用宏来定义的,用p来打印该变量的值,结果如下:
网上查阅资料,说是编译时要加入 ‘-gstabs+’ 选项,不过添加后仍然没有效果;
在后面子模块中也出现了类似的问题,即凡是在头文件“GPS.h”中用宏定义的值(假设为ALen),在子函数单步调试时总是直接跳过含ALen的语句,当打印ALen的值时也是提示‘No symbol "ALen" in current context.“
注:【自己没有建立项目或工程,所有文件(源、头、目标、Makefile等均在同一个文件夹下)】
自己觉得问题应该就在这,但在VS2010测试时头文件中宏定义的值在子函数(包含头文件)中可以直接使用,请问该怎么解决
#10
通常情况下gdb里面是无法访问macro的。
查看如何在gdb中使用macro,需要编译器配合。
info gdb Macros
查看如何在gdb中使用macro,需要编译器配合。
#11
不知道你的 ALen 是什么,调试代码,没必要纠结宏的值是多少,看一下代码就知道了,你可以 p 变量
#12
拜托
你的程序的名字叫edit呃
gdb edit
你的程序的名字叫edit呃
gdb edit
#13
#1
gdb 和 makefile有什么关系?你的GPS 是什么?先试着调 helloworld 吧
#2
是这样的,我准备用C++语言实现完整的GPS通信系统,操作系统是linux,自己把所有的cpp文件都放在同一个文件夹GPS_cpp中。由于系统模块(.cpp文件)很多,为了编译方便,于是写了一个Makefile文件在终端进行整体编译;编译通过后想对程序各个模块进行调试,查看各个输出结果是否正确。经网上查阅可以直接对Makefile文件进行修改方便gdb调试(比如在每个源文件.cpp前面添加-g命令等),命令“gdb GPS”中的GPS是主程序的名字。现在出现了上面的问题,请问我该怎么修改
#3
g++ -o edit $(objects) -lm
没有 GPS
没有 GPS
#4
好像不对,
我准备采用gdb进行调试,你这是编译命令,不是调试吧。
#5
我是参照这个来的,http://blog.sina.com.cn/s/blog_59f549a20101j1fh.html
#6
你生成的文件名不叫 gps,你调试 gps 什么啊
#7
的确如你所说,我最后生成的是edit可执行文件,采用gdb edit命令后可以进入调试啦,多谢啦!不过在单步调试时发现程序语句的执行顺序和自己预期的不一样,变量值也不一样,网上说可能是开启了优化导致的,可我的Makefile中没有开启任何优项,如下图
#8
g++ -ggdb -Wall -c GPS.cpp
也可能代码本身就有问题
也可能代码本身就有问题
#9
好像还是不行。
仔细调试了下代码,调试过程是这样的。进入gdb调试状态后首先list出主函数前面部分代码
上图是主函数的部分代码,其中的wal和psh分别是2个子函数。开始断点调试,这里在psh函数入口设置断点。
psh子函数前面部分代码如下:
#include"GPS.h"
void psh(short *pIn,long int InLen,double *pOut,long int *OutLen)
{
int j;
long int i;
double Temp;
// double zeros[gPsh_Rank-1];
// double *pPsh;
//static double *pPsh=(double *)malloc(Len*sizeof(double));
static short PshTemp[gPsh_Rank-1];
static short *pOutTemp;
if(gFirstPshFlag)
{
pOutTemp=(short *)malloc((Psh_OutLen+gPsh_Rank-1)*sizeof(short));
gFirstPshFlag=0;
}
在断点调试进入到psh子函数中,用n命令单步调试,如下
结果可以看出
{
pOutTemp=(short *)malloc((Psh_OutLen+gPsh_Rank-1)*sizeof(short));
gFirstPshFlag=0;
}
中的malloc()语句没有被执行。
这里Psh_OutLen是在头文件“GPS.h”(psh源文件包含该头文件)中用宏来定义的,用p来打印该变量的值,结果如下:
网上查阅资料,说是编译时要加入 ‘-gstabs+’ 选项,不过添加后仍然没有效果;
在后面子模块中也出现了类似的问题,即凡是在头文件“GPS.h”中用宏定义的值(假设为ALen),在子函数单步调试时总是直接跳过含ALen的语句,当打印ALen的值时也是提示‘No symbol "ALen" in current context.“
注:【自己没有建立项目或工程,所有文件(源、头、目标、Makefile等均在同一个文件夹下)】
自己觉得问题应该就在这,但在VS2010测试时头文件中宏定义的值在子函数(包含头文件)中可以直接使用,请问该怎么解决
#10
通常情况下gdb里面是无法访问macro的。
查看如何在gdb中使用macro,需要编译器配合。
info gdb Macros
查看如何在gdb中使用macro,需要编译器配合。
#11
不知道你的 ALen 是什么,调试代码,没必要纠结宏的值是多少,看一下代码就知道了,你可以 p 变量
#12
拜托
你的程序的名字叫edit呃
gdb edit
你的程序的名字叫edit呃
gdb edit