LU-LSP-b13:LA

From DiLab
Jump to: navigation, search

Linux lietotāja programmatūras atkļūdošanas rīki

  • gdb - GNU debugger
    • gdbserver - GDB papildprogramma attālinātai atklūdošanai. gdbserver var palaist, piemēram, uz iegultas sistēmas bez grafiskās saskarnes, un atkļūdot tur esošās programmas caur TCP savienojumu, pieslēdzoties ar "parasto" GDB kā ar klientu.
  • valgrind - apvieno sevī vairākus jaudīgus rīkus: dinamiskās atmiņas lietošanas pārbaudes rīku (--tool=memcheck), profilētāju (--tool=callgrind) u.c.
  • objdump - disasemblēšanas rīks, simbolu informācija
  • /proc failusistēma - visa veida informācija par procesiem un sistēmas resursiem
  • strace & ltrace utilītas, ptrace sistēmas izsaukums - konkrēta procesa darbības izsekošana
  • Dažāda veida informācija par resursu lietojumu:
    • ps - procesi
    • top/htop - aktīvākie procesi
    • nstat - tīkls ("network status")
    • vmstat - atmiņa ("virtual memory status")
  • Vēl cita veida informācija par resursu lietojumu (vairāk kodola un HW atkļūdošanai?):
    • lsusb - parādīt pieslēgtās USB ierīces ("list usb")
    • lspci - parādīt pieslēgtās PCI ierīces ("list pci")
    • lsof - parādīt atvērtos failus ("list open files")


Piemērs

Atkļūdojamās programmas kods:

#include <stdio.h>
#include <stdlib.h>

void nullDeref(int *p) {
    *p = 0x1234;
}

void f(int param);
void g(void) {
    printf("calling g\n");
    f(0);
}

void f(int param) {
    int localVariable = 1;
    printf("calling f, &localVariable=%p\n", &localVariable);
    g();
}

void stackOverflow(void) {
    f(1);
}

void memoryAllocate(void) {
    int i, j;
    char *array = malloc(10);
    i = j = 5;
    while (i-- >= 0) {
        array[i] = 0x13;
    }
    while (j++ >= 0) {
        array[j] = 0x13;
    }
}


int main(void) {
    int i;
    int *p = NULL;
    nullDeref(p);
    stackOverflow();
    for (i = 0; i < 100; ++i) {
        memoryAllocate();
    }
    return 0;
}