GNU Debugger tabi GDB: Ọpa N ṣatunṣe Koodu Orisun Alagbara fun Awọn Eto Lainos


Apanirun kan ṣe ipa pataki ninu eyikeyi eto idagbasoke sọfitiwia. Ko si ẹnikan ti o le kọ koodu ti ko ni kokoro ni ẹẹkan. Lakoko idagbasoke, awọn idun ti wa ni igbega ati pe o nilo lati yanju fun ilọsiwaju siwaju. Eto idagbasoke ko pe laisi apanirun kan. Ṣiyesi agbegbe awọn olupilẹṣẹ orisun ṣiṣi, GNU Debugger ni yiyan ti o dara julọ. O tun lo fun idagbasoke sọfitiwia iṣowo lori awọn iru ẹrọ UNIX.

GNU Debugger, ti a tun mọ ni gdb, gba wa laaye lati yọ nipasẹ koodu lakoko ti o n ṣe tabi kini eto ti n gbiyanju lati ṣe ni akoko ṣaaju ki o to kọlu. GDB ṣe iranlọwọ fun wa ni ipilẹṣẹ lati ṣe awọn ohun akọkọ mẹrin lati mu awọn abawọn ninu koodu orisun.

  1. Bẹrẹ eto naa, n ṣalaye awọn ariyanjiyan ti o le ni ipa lori ihuwasi gbogbogbo.
  2. Da eto naa duro lori awọn ipo pàtó.
  3. Ṣayẹwo jamba naa tabi nigbati a da eto duro.
  4. Yi koodu pada ki o ṣe idanwo pẹlu koodu ti a tunṣe lẹsẹkẹsẹ.

A le lo gdb lati ṣatunṣe awọn eto ti a kọ sinu C ati C ++ laisi igbiyanju pupọ. Gẹgẹ bi ti atilẹyin bayi fun awọn ede siseto miiran bi D, Modula-2, Fortran jẹ apakan.

Bibẹrẹ pẹlu GNU Debugger tabi GDB

A pe GDB ni lilo pipaṣẹ gdb . Lori ipinfunni gdb , o ṣe afihan diẹ ninu alaye nipa pẹpẹ ati ki o sọ ọ silẹ sinu iyara ( gdb ) bi a ṣe han ni isalẹ.

 gdb
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law.  Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-redhat-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word". 
(gdb)

Tẹ iranlọwọ atokọ lati jade awọn kilasi oriṣiriṣi ti awọn ofin ti o wa ninu gdb. Tẹ iranlọwọ atẹle nipa orukọ kilasi fun atokọ ti awọn aṣẹ ninu kilasi naa. Tẹ ṣe iranlọwọ fun gbogbo fun atokọ ti gbogbo awọn ofin. Awọn abọ orukọ aṣẹ ni a gba laaye ti wọn ko ba jẹ alaitumọ. Fun apẹẹrẹ, o le tẹ n dipo titẹ atẹle tabi c fun tẹsiwaju ati bẹbẹ lọ.

A ṣe akojọ awọn aṣẹ gdb ti a lo nigbagbogbo ni tabili atẹle. Awọn ofin wọnyi ni lati lo lati aṣẹ pipaṣẹ gdb ( gdb ).

Ṣe akiyesi iyatọ laarin awọn ofin meji igbesẹ ati atẹle Atẹle ti n tẹle ko lọ si iṣẹ inu ti ila atẹle ba jẹ ipe iṣẹ kan. Lakoko ti igbesẹ aṣẹ le lọ sinu iṣẹ inu ati wo ohun ti o ṣẹlẹ nibẹ.

Wo koodu orisun atẹle.

// sum.c
#include <stdio.h> 

int sum (int a, int b) { 
	int c; 
	c = a + b; 
	return c; 
} 

int main() { 
	int x, y, z; 
	printf("\nEnter the first number: "); 
	scanf("%d", &x); 
	printf("Enter the second number: "); 
	scanf("%d", &y); 
	z = sum (x, y); 
	printf("The sum is %d\n\n", z); 
	return 0; 
}

Lati le ṣatunṣe faili o wu a nilo lati ṣajọ kanna pẹlu aṣayan -g si gcc gẹgẹbi atẹle.

$ gcc -g sum.c -o sum

Faili o wu apao le sopọ si gdb nipasẹ boya awọn ọna 2 wọnyi:

1. Nipa ṣiṣe alaye faili o wu bi ariyanjiyan si gdb.

$ gdb sum

2. Ṣiṣe faili ti o wu inu gdb nipa lilo faili pipaṣẹ.

$ gdb
(gdb) file sum

Atokọ awọn atokọ awọn ila laini faili koodu orisun ati gbigbe ijuboluwole. Nitorina akọkọ atokọ yoo han awọn ila 10 akọkọ ati atẹle atokọ han 10 atẹle ati bẹbẹ lọ.

(gdb) list
1	#include <stdio.h>   
2	 
3	int sum (int a, int b) { 
4		int c; 
5		c = a + b; 
6		return c; 
7	} 
8	 
9	int main() { 
10		int x, y, z;

Lati bẹrẹ ipaniyan, gbejade pipaṣẹ ṣiṣe . Bayi eto naa n ṣiṣẹ deede. Ṣugbọn a gbagbe lati fi diẹ ninu awọn aaye fifọ sinu koodu orisun fun n ṣatunṣe aṣiṣe, otun? Awọn aaye fifọ wọnyi le ṣe pàtó fun awọn iṣẹ tabi ni awọn ila pàtó kan.

(gdb) b main

Akiyesi: Mo ti lo abbreviation b fun fifọ.

Lẹhin ti o ṣeto aaye fifọ ni iṣẹ akọkọ, atunkọ eto naa yoo duro ni laini 11. Ohun kanna ni a le ṣe si ipa ti o ba mọ nọmba laini ṣaaju.

(gdb) b sum.c:11

Bayi igbesẹ nipasẹ awọn ila ti koodu nipa lilo atẹle tabi n aṣẹ. O ṣe pataki lati ṣe akiyesi pe atẹle aṣẹ ko lọ si koodu iṣẹ inu ayafi ti o ba ṣeto aaye fifọ lori iṣẹ naa. Jẹ ki a gbiyanju tẹjade aṣẹ bayi. Ṣeto aaye fifọ lori apao iṣẹ bi isalẹ.

(gdb) b sum 
Breakpoint 1 at 0x4005aa: file sum.c, line 5. 
(gdb) r 
Starting program: /root/sum 

Enter the first number: 2 
Enter the second number: 3 

Breakpoint 1, sum (a=2, b=3) at sum.c:5 
5		c = a + b; 
(gdb) p a 
$1 = 2 
(gdb) p b 
$2 = 3
(gdb) c 
Continuing. 
The sum is 5 

[Inferior 1 (process 3444) exited normally]

Ti eto ti n ṣiṣẹ nbeere awọn aye laini aṣẹ lẹhinna pese kanna pẹlu pẹlu ṣiṣe aṣẹ bi.

(gdb) run   . . .

Awọn faili ile-ikawe pinpin ti o ni nkan ṣe pẹlu eto ṣiṣe lọwọlọwọ le ṣe atokọ bi.

(gdb) info share 
From                To                  Syms Read   Shared Object Library 
0x00000035a6000b10  0x00000035a6019c70  Yes         /lib64/ld-linux-x86-64.so.2 
0x00000035a641f560  0x00000035a6560bb4  Yes         /lib64/libc.so.6

GDB tun lagbara lati ṣe iyipada awọn oniyipada jakejado ipaniyan ti eto naa. Jẹ ki a gbiyanju eyi. Gẹgẹbi a ti sọ loke ṣeto aaye fifọ ni ila 16 ati ṣiṣe eto naa.

(gdb) r 
Starting program: /root/sum 

Enter the first number: 1 
Enter the second number: 2 

Breakpoint 1, main ( ) at sum.c:16 
16		printf("The sum is %d\n\n", z); 
(gdb) set z=4 
(gdb) c 
Continuing. 
The sum is 4

Bayi a = 1, b = 2 ati abajade yẹ ki o jẹ z = 3. Ṣugbọn nibi a yi abajade ikẹhin pada si z = 4 ninu iṣẹ akọkọ. Ni ọna yii n ṣatunṣe aṣiṣe le jẹ ki o rọrun nipa lilo gdb.

Lati gba atokọ ti gbogbo awọn aaye fifọ iru awọn ibi fifọ awọn alaye .

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep y   0x00000000004005c2 in main at sum.c:11

Nibi aaye fifọ kan nikan wa ati pe o jẹ Lati. mu ṣiṣẹ mu awọn aaye fifọ pato nọmba fifọ pẹlu aṣẹ mu kuro. Lati mu ṣiṣẹ lẹhinna lo pipaṣẹ jeki .

(gdb) disable 1 
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep n   0x00000000004005c2 in main at sum.c:11

O tun le paarẹ awọn aaye fifọ pẹlu paarẹ aṣẹ.

Ọpọlọpọ awọn ilana ṣiṣe ni abẹlẹ ni eto GNU/Linux. Lati ṣatunṣe ilana ṣiṣe ni akọkọ gbogbo a nilo lati wa id ilana ti ilana yẹn pato. pidof aṣẹ fun ọ ni pid ti ilana kan.

$ pidof <process_name>

Bayi a nilo lati so pid yii pọ si gdb. Awọn ọna 2 wa.

1. Nipa sisọ pid pẹlu gdb.

$ gdb -p <pid>

2. Lilo so pipaṣẹ lati gdb.

(gdb) attach <pid>

Iyẹn ni gbogbo fun bayi. Iwọnyi nikan ni awọn ipilẹ ti gdb lati ni ibẹrẹ ti o dara ninu n ṣatunṣe koodu orisun ati pe o jẹ diẹ sii ju awọn ohun ti o salaye loke. Fun apẹẹrẹ, a le ṣatunṣe aṣiṣe nipa lilo alaye akopọ, awọn oniyipada ayika ati pupọ diẹ sii. Gbiyanju lati ṣere ni ayika pẹlu gbogbo awọn nkan wọnyi ...