怎么用gdb对Makefile文件中的多个cpp进行调试

时间:2020-12-27 16:40:23
 最近开始学习linux下的程序调试,下面是自己写的Makefile文件:

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


引用 1 楼 zhxianbin 的回复:
gdb 和 makefile有什么关系?你的GPS 是什么?先试着调 helloworld 吧

是这样的,我准备用C++语言实现完整的GPS通信系统,操作系统是linux,自己把所有的cpp文件都放在同一个文件夹GPS_cpp中。由于系统模块(.cpp文件)很多,为了编译方便,于是写了一个Makefile文件在终端进行整体编译;编译通过后想对程序各个模块进行调试,查看各个输出结果是否正确。经网上查阅可以直接对Makefile文件进行修改方便gdb调试(比如在每个源文件.cpp前面添加-g命令等),命令“gdb GPS”中的GPS是主程序的名字。现在出现了上面的问题,请问我该怎么修改

#3


g++ -o edit $(objects) -lm

没有 GPS

#4


引用 3 楼 zhxianbin 的回复:
g++ -o edit $(objects) -lm

没有 GPS


好像不对, 怎么用gdb对Makefile文件中的多个cpp进行调试
我准备采用gdb进行调试,你这是编译命令,不是调试吧。

#5


引用 3 楼 zhxianbin 的回复:
g++ -o edit $(objects) -lm

没有 GPS


我是参照这个来的,http://blog.sina.com.cn/s/blog_59f549a20101j1fh.html

#6


你生成的文件名不叫 gps,你调试 gps 什么啊

#7


引用 6 楼 zhxianbin 的回复:
你生成的文件名不叫 gps,你调试 gps 什么啊

        的确如你所说,我最后生成的是edit可执行文件,采用gdb edit命令后可以进入调试啦,多谢啦!不过在单步调试时发现程序语句的执行顺序和自己预期的不一样,变量值也不一样,网上说可能是开启了优化导致的,可我的Makefile中没有开启任何优项,如下图
怎么用gdb对Makefile文件中的多个cpp进行调试

#8


g++ -ggdb -Wall -c GPS.cpp

也可能代码本身就有问题

#9


引用 8 楼 zhxianbin 的回复:
g++ -ggdb -Wall -c GPS.cpp

也可能代码本身就有问题

好像还是不行。
仔细调试了下代码,调试过程是这样的。进入gdb调试状态后首先list出主函数前面部分代码
怎么用gdb对Makefile文件中的多个cpp进行调试
上图是主函数的部分代码,其中的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命令单步调试,如下
怎么用gdb对Makefile文件中的多个cpp进行调试
结果可以看出

{
pOutTemp=(short *)malloc((Psh_OutLen+gPsh_Rank-1)*sizeof(short));
gFirstPshFlag=0;
}

中的malloc()语句没有被执行。
       这里Psh_OutLen是在头文件“GPS.h”(psh源文件包含该头文件)中用宏来定义的,用p来打印该变量的值,结果如下:
怎么用gdb对Makefile文件中的多个cpp进行调试
网上查阅资料,说是编译时要加入 ‘-gstabs+’  选项,不过添加后仍然没有效果;
        在后面子模块中也出现了类似的问题,即凡是在头文件“GPS.h”中用宏定义的值(假设为ALen),在子函数单步调试时总是直接跳过含ALen的语句,当打印ALen的值时也是提示‘No symbol "ALen" in current context.“

        注:【自己没有建立项目或工程,所有文件(源、头、目标、Makefile等均在同一个文件夹下)】

         自己觉得问题应该就在这,但在VS2010测试时头文件中宏定义的值在子函数(包含头文件)中可以直接使用,请问该怎么解决

#10


通常情况下gdb里面是无法访问macro的。

info gdb Macros

查看如何在gdb中使用macro,需要编译器配合。

#11


不知道你的 ALen 是什么,调试代码,没必要纠结宏的值是多少,看一下代码就知道了,你可以 p 变量

#12


拜托
你的程序的名字叫edit呃
gdb edit

#13


该回复于2015-10-23 08:31:06被管理员删除

#1


gdb 和 makefile有什么关系?你的GPS 是什么?先试着调 helloworld 吧

#2


引用 1 楼 zhxianbin 的回复:
gdb 和 makefile有什么关系?你的GPS 是什么?先试着调 helloworld 吧

是这样的,我准备用C++语言实现完整的GPS通信系统,操作系统是linux,自己把所有的cpp文件都放在同一个文件夹GPS_cpp中。由于系统模块(.cpp文件)很多,为了编译方便,于是写了一个Makefile文件在终端进行整体编译;编译通过后想对程序各个模块进行调试,查看各个输出结果是否正确。经网上查阅可以直接对Makefile文件进行修改方便gdb调试(比如在每个源文件.cpp前面添加-g命令等),命令“gdb GPS”中的GPS是主程序的名字。现在出现了上面的问题,请问我该怎么修改

#3


g++ -o edit $(objects) -lm

没有 GPS

#4


引用 3 楼 zhxianbin 的回复:
g++ -o edit $(objects) -lm

没有 GPS


好像不对, 怎么用gdb对Makefile文件中的多个cpp进行调试
我准备采用gdb进行调试,你这是编译命令,不是调试吧。

#5


引用 3 楼 zhxianbin 的回复:
g++ -o edit $(objects) -lm

没有 GPS


我是参照这个来的,http://blog.sina.com.cn/s/blog_59f549a20101j1fh.html

#6


你生成的文件名不叫 gps,你调试 gps 什么啊

#7


引用 6 楼 zhxianbin 的回复:
你生成的文件名不叫 gps,你调试 gps 什么啊

        的确如你所说,我最后生成的是edit可执行文件,采用gdb edit命令后可以进入调试啦,多谢啦!不过在单步调试时发现程序语句的执行顺序和自己预期的不一样,变量值也不一样,网上说可能是开启了优化导致的,可我的Makefile中没有开启任何优项,如下图
怎么用gdb对Makefile文件中的多个cpp进行调试

#8


g++ -ggdb -Wall -c GPS.cpp

也可能代码本身就有问题

#9


引用 8 楼 zhxianbin 的回复:
g++ -ggdb -Wall -c GPS.cpp

也可能代码本身就有问题

好像还是不行。
仔细调试了下代码,调试过程是这样的。进入gdb调试状态后首先list出主函数前面部分代码
怎么用gdb对Makefile文件中的多个cpp进行调试
上图是主函数的部分代码,其中的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命令单步调试,如下
怎么用gdb对Makefile文件中的多个cpp进行调试
结果可以看出

{
pOutTemp=(short *)malloc((Psh_OutLen+gPsh_Rank-1)*sizeof(short));
gFirstPshFlag=0;
}

中的malloc()语句没有被执行。
       这里Psh_OutLen是在头文件“GPS.h”(psh源文件包含该头文件)中用宏来定义的,用p来打印该变量的值,结果如下:
怎么用gdb对Makefile文件中的多个cpp进行调试
网上查阅资料,说是编译时要加入 ‘-gstabs+’  选项,不过添加后仍然没有效果;
        在后面子模块中也出现了类似的问题,即凡是在头文件“GPS.h”中用宏定义的值(假设为ALen),在子函数单步调试时总是直接跳过含ALen的语句,当打印ALen的值时也是提示‘No symbol "ALen" in current context.“

        注:【自己没有建立项目或工程,所有文件(源、头、目标、Makefile等均在同一个文件夹下)】

         自己觉得问题应该就在这,但在VS2010测试时头文件中宏定义的值在子函数(包含头文件)中可以直接使用,请问该怎么解决

#10


通常情况下gdb里面是无法访问macro的。

info gdb Macros

查看如何在gdb中使用macro,需要编译器配合。

#11


不知道你的 ALen 是什么,调试代码,没必要纠结宏的值是多少,看一下代码就知道了,你可以 p 变量

#12


拜托
你的程序的名字叫edit呃
gdb edit

#13


该回复于2015-10-23 08:31:06被管理员删除