配色: 字号:
linux C- gdb调试、Makefile
2016-09-24 | 阅:  转:  |  分享 
  
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,事实上那是画蛇添足。只需要将所有的文件放在当前的文件夹下即可。

献花(0)
+1
(本文系网络学习天...首藏)