Syntax highlighting of Archiv/Ladění pod UNIXEM - gdb, mtrace

==Programy a chyby==
Téměř každý program má svoje chyby. Chyby mohou být jak v návrhu(program tak jak je naržen nefunguje správně),
tak v realizaci (chyby v kódu). Praktičtější je ovšem chyby rozdělit na chyby "aktivní" a pasivní. Do první 
skupiny patří chyby patrné na první pohled, tj. program nedělá to co má, nebo padá. Do druhé skupiny patří typicky
chyby v alokaci a uvolňování paměti. Druhou skupinu je výrazně obtížnější jak detekovat, tak odhalit.
===Fáze ladění kódu===
Vytváření a aldění nového software vpostatě probíhá podle následujícího shématu:
 DOPSAL JSEM SOFTWARE                                                                   
 TESTUJU HO                                                                             
 if (V PROGRAMU JE CHYBA) goto ZACATEK LADENI else goto KONEC                           
  ZACATEK LADENI                                                                       
  STABILIZUJ CHYBU //zajisteni aby se chyba opakovala                                  
  LOKALIZUJ CHYBU  //nalezeni příslušné knihovny, funkce, řádku, kde k chybam dochazi  
  OPRAV CHYBU                                                                          
 goto TESTUJ HO                                                                       
 KONEC //program je odladěný a můžeme začít s distribucí.

===Možnosti ladění kódu===
====Expertní čtení====
Nejjednosušší je tzv "expertní čtení", aneb "Strécu, ono to nefacha, tak se do toho hleď ještě mrknout.". Tohle je jistě
možnost, ale má nevýhodu zejména psychologickou, pokud jsme udělali logickou chybu v návrhu, je poměrně těžké ji 
odstranit jen čtením kódu, protože se ném kód zdá v pořádku. Je to (prý) poměrně funkční v případě, že kód po nás čte 
někdo jiný.
====Ladící výpisy====
Asi nejobecnější možnost ladění, funguje skoro vždy a skoro všude. Je dobré vypisovat na stderr, pač jinak pokud 
něco vypíšete na stdin a program pak "spadne", hláška se může v principu stratit (neměla by, ale experimentálně je 
tohle tvrzení ověřené).
Do programu je možné zařadit výpisy na místa, kde čekáme, že by mohlo dojít k chybě.
Docela rozumné může být využít makroprocesoru překladače, napřiklad konstrukcí 

 #ifdef DEBUG
   printf ("hodnota x je : %d\n", x);
 #endif

a makro DEBUG si definovat třeba při překladu

 $ cc -o sorter -DDEBUG main.c
A jinak v jazyce c/c++  jsou k dispozici makra
{| border=1 cellspacing=0 cellpadding=5
| __LINE__
| Číslo aktuální řádky
|-
| __FILE__
| Jméno souboru
|- 
| __DATE__
| datum, Řetězec formátu "Mmm dd yyyy"
|-
| __TIME__
| čas, Řetězec formátu "h h : mm : s s"
|-  
|}

====Ladící nástroje====
Jsou asi neúčinnější formou ladění, (pokud jsou dostupné), pod unixovými systémy je obvykle k dspozici pro ladění 
chyb, které se projevují db, který má pod linuxem obdobu gdb. Na skryté chyby, např v alokaci paměti jsou k dispozici
nástroje typu mtrace, nebo knihovna electric fence (možná pár slov na konci).
Program gdb nám umožňuje pozorovat co se děje v "programu vevnitř", popřípadě toto dokonce měnit.
==Ukázkový příklad 1.==
main.c

 #include <stdio.h>
 #include <stdlib.h>
 #include "qsort.h"
 int main(int argc, char ** argv){
  
  int i;
  int cisla[] = {10, 12, 2, 4, 8,7, 1, 20, 3, 25};
  int *  cilsa;
  int arrsize = sizeof(cisla) / sizeof(int); 
  printf("\n\nhello, Im Program for sorting.. ");
  
  printf("\nthis is my input  :");
  for (i=0; i < arrsize; i++){
    printf("%d ",cisla[i] );
  }
  //tady se to celý děje.
  xquickSort(cilsa,  arrsize);
  
  printf("\nthis is my output :");
  
  for (i=0; i < arrsize; i++){
    printf("%d ",cisla[i] );
  }
  printf("\nDo you think it's OK?\n");
  return 0;
 }

qsort.c
 
 void xq_sort(int numbers[], int left, int right){
  int pivot, l_hold, r_hold;

  l_hold = left;
  r_hold = right;
  pivot = numbers[left];
  while (left < right)
  {
    while ((numbers[right] >= pivot) && (left < right))
      right--;
    if (left != right)
    {
      numbers[left] = numbers[right];
      left++;
    }
    while ((numbers[left] <= pivot) && (left < right))
      left++;
    if (left != right)
    {
      numbers[right] = numbers[left];
      right--;
    }
  }
  numbers[left] = pivot;
  pivot = left;
  left = l_hold;
  right = r_hold;
  if (left < pivot)
    xq_sort(numbers, left, pivot-1);
  if (right > pivot)
    xq_sort(numbers, pivot+1, right);

 }

qsort.h

 extern void xquickSort(int numbers[], int array_size);
Makefile

 EXECUTABLE	= sorter 
 SOURCES		= main.c qsort.c
 HEADERS		= qsort.h
 OBJECTS		= $(SOURCES:.c=.o)
 CC		= gcc
 CFLAGS		= -ggdb -Wall
 LDFLAGS		= -o 
 all: $(EXECUTABLE) 
 clean:
	rm *.o $(EXECUTABLE)

 $(EXECUTABLE): $(OBJECTS)
	$(CC) $(LDFLAGS) $@ $^
 $(OBJECTS): $(SOURCES) $(HEADERS)