linuxC-gdb调试、Makefile
gcc可以编译c,c++,object-c,java等众多的语言程序
g++则是专注于C和C++。
gdb调试
GDB调试器是一个功能强大的工具,它可以做很多的调试工作,如断点,单步跟踪等。
相关命令:
下面演示两个例子,追踪快速排序的过程和查看优化后的gcd()算法(方法来自编程之美)
观察快速排序:
打印数组,查看快速排序中各个元素的位置变化
源码:
#include
#include
usingnamespacestd;
intpartion(inta[],intstart,intend){
inti=start,j=end;
inttemp=a[start];
while(i while(i=temp)j--;
a[i]=a[j];//iaremore
while(i a[j]=a[i];//jaremore
}
a[i]=temp;//atend,i=j
returni;
}
voidQsort(inta[],intstart,intend){
if(start intd=partion(a,start,end);
Qsort(a,start,d);
Qsort(a,d+1,end);
}
}
intmain(){
inta[10]={3,2,7,5,1,0,9,6,4,11};
Qsort(a,0,9);
for(inti=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
return0;
}
指令:
edemon@linux:~$g++-g-oexemain.cpp
edemon@linux:~$gdbexe
(gdb)break17
Breakpoint1at0x4006f4:filemain.cpp,line17.
(gdb)run
Breakpoint1,Qsort(a=0x7fffffffdda0,start=0,end=9)atmain.cpp:17
17if(start (gdb)pa@10
$2={3,2,7,5,1,0,9,6,4,11}
(gdb)continue
Breakpoint1,Qsort(a=0x7fffffffdda0,start=0,end=3)atmain.cpp:17
17if(start (gdb)pa@10
$3={0,2,1,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=0,end=0)atmain.cpp:17
17if(start (gdb)pa@10
$4={0,2,1,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=1,end=3)atmain.cpp:17
17if(start (gdb)pa@10
$5={0,2,1,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=1,end=2)atmain.cpp:17
17if(start (gdb)pa@10
$6={0,1,2,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=1,end=1)atmain.cpp:17
17if(start (gdb)pa@10
$7={0,1,2,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=2,end=2)atmain.cpp:17
17if(start (gdb)pa@10
$8={0,1,2,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=3,end=3)atmain.cpp:17
17if(start (gdb)pa@10
$9={0,1,2,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=4,end=9)atmain.cpp:17
17if(start (gdb)pa@10
$10={0,1,2,3,5,7,9,6,4,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=4,end=5)atmain.cpp:17
17if(start (gdb)pa@10
$11={0,1,2,3,4,5,9,6,7,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=4,end=4)atmain.cpp:17
17if(start (gdb)pa@10
$12={0,1,2,3,4,5,9,6,7,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=5,end=5)atmain.cpp:17
17if(start (gdb)pa@10
$13={0,1,2,3,4,5,9,6,7,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=6,end=9)atmain.cpp:17
17if(start (gdb)pa@10
$14={0,1,2,3,4,5,9,6,7,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=6,end=8)atmain.cpp:17
17if(start (gdb)pa@10
$15={0,1,2,3,4,5,7,6,9,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=6,end=7)atmain.cpp:17
17if(start (gdb)pa@10
$16={0,1,2,3,4,5,6,7,9,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=6,end=6)atmain.cpp:17
17if(start (gdb)pa@10
$17={0,1,2,3,4,5,6,7,9,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=7,end=7)atmain.cpp:17
17if(start (gdb)pa@10
$18={0,1,2,3,4,5,6,7,9,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=8,end=8)atmain.cpp:17
17if(start (gdb)pa@10
$19={0,1,2,3,4,5,6,7,9,11}
(gdb)continue
Continuing.
Breakpoint1,Qsort(a=0x7fffffffdda0,start=9,end=9)atmain.cpp:17
17if(start (gdb)pa@10
$20={0,1,2,3,4,5,6,7,9,11}
(gdb)continue
Continuing.
01234567911
[Inferior1(process7467)exitednormally]
计算24,26的最大公约数:
使用gdb查看递归情况,a和b是怎样变化的。
源码:
#include
#include
#include
usingnamespacestd;
typedeflonglongLL;
constLLN=1e5+10;
LLodd(LLa){
returna&(1LL);
}
LLgcd(LLa,LLb){
if(a>b)swap(a,b);
if(a==0)returnb;
if(odd(a)&&odd(b))returngcd(b-a,a);
if(!odd(a)&&odd(b))returngcd(a>>1,b);
if(odd(a)&&!odd(b))returngcd(a,b>>1);
if(!odd(a)&&!odd(b))returngcd(a>>1,b>>1)<<1;
}
intmain(){
cout< return0;
}
指令:
$g++-g-oexemain.cpp
$gdbexe
(gdb)run
Breakpoint1,gcd(a=24,b=26)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=12,b=13)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=6,b=13)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=3,b=13)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=10,b=3)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=3,b=5)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=2,b=3)atmain.cpp:10
]10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=1,b=3)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=2,b=1)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=1,b=1)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
Breakpoint1,gcd(a=0,b=1)atmain.cpp:10
10if(a>b)swap(a,b);
(gdb)continue
Continuing.
makefile
Linux中的make工具提供了一种管理工程的功能,编写Makefile文件,通过make命令将多个文件编译为可执行文件
例如:
main.c
t1.c//output“helloworld”
t2.c//output“I’mlearninglinuxc”
action.h
action.h:
#ifdef__ACTION_H__
#define__ACTION_H__
externvoidaction1();
externvoidaction2();
#endif
main.c
#include"action.h"
intmain(){
action1();
action2();
return0;
}
t1.c:
#include
voidaction1(){
printf("helloworld\n");
}
t2.c:
#include
voidaction2(){
printf("I''mlearninglinuxC\n");
}
Makefile:
exe:action1.oaction2.omain.oaction.h
gcc-oexeaction1.oaction2.omain.o
gcc-c-oaction1.ot1.c
action1.o:action.ht1.c
action2.o:action.ht2.c
gcc-c-oaction2.ot2.c
main.o:actwww.shanxiwang.netion.hmain.c
clean:
rm-fexeaction1.oaction2.omain.o
edemon@linux:/media/edemon/document/program/prodoc/contest/newpra/makeFile$make
gcc-c-oaction2.ot2.c
cc-c-omain.omain.c
main.c:Infunction‘main’:
main.c:3:5:warning:implicitdeclarationoffunction‘action1’[-Wimplicit-function-declaration]
action1();
^
main.c:4:5:warning:implicitdeclarationoffunction‘action2’[-Wimplicit-function-declaration]
action2();
^
gcc-oexeaction1.oaction2.omain.o
gcc-c-oaction1.ot1.c
edemon@linux:/media/edemon/document/program/prodoc/contest/newpra/makeFile$ls
action1.oaction2.oaction.hexemain.cmain.oMakefilet1.ct2.c
edemon@linux:/media/edemon/document/program/prodoc/contest/newpra/makeFile$./exe
helloworld
I''mlearninglinuxC
常见问题:
Makefile:2:missingseparator.Stop.
第二行命令缺少tab空格
加tab空格后颜色改变。
make:Noruletomaketarget‘action.h’,neededby‘action1.o’.Stop.
我将头文件放到了/usr/include,事实上那是画蛇添足。只需要将所有的文件放在当前的文件夹下即可。
|
|