• chevron_right

      Debugger - backtrace

      pubsub.movim.eu / devlug • 30 November 2025

    Wir nehmen als Beispiel folgendes Programm.

    #include <stdio.h>
    #include <stdlib.h>
    
    int f(int n) {
      if (n == 0)
        return 1;
      return n * f(n - 1);
    }
    
    int main(int argc, char *argv[]) {
      if (argc < 2) {
        return EXIT_FAILURE;
      }
      int n = atoi(argv[1]);
      printf("f(%d) = %d\n", n, f(n));
      return EXIT_SUCCESS;
    }
    

    Kompiliert wird es wieder mit der -g-Option.

    gcc -g -o demo1 demo1.c
    

    Wir starten das Programm im Debugger gdb --args ./demo 8 und setzen direkt ein break auf die f-Funktion.

    (gdb) break f
    Breakpoint 1 at 0x1154: file demo1.c, line 5.
    

    Lässt man das Programm eine paar Schritte laufen, kommt folgendes raus:

    (gdb) bt
    #0  f (n=3) at demo1.c:7
    #1  0x000055555555516e in f (n=4) at demo1.c:7
    #2  0x000055555555516e in f (n=5) at demo1.c:7
    #3  0x000055555555516e in f (n=6) at demo1.c:7
    #4  0x000055555555516e in f (n=7) at demo1.c:7
    #5  0x000055555555516e in f (n=8) at demo1.c:7
    #6  0x00005555555551b0 in main (argc=2, argv=0x7fffffffe1d8) at demo1.c:15
    
    • chevron_right

      Debugger - backtrace

      pubsub.movim.eu / devlug • 30 November 2025

    Wir nehmen als Beispiel folgendes Programm.

    #include <stdio.h>
    #include <stdlib.h>
    
    int f(int n) {
      if (n == 0)
        return 1;
      return n * f(n - 1);
    }
    
    int main(int argc, char *argv[]) {
      if (argc < 2) {
        return EXIT_FAILURE;
      }
      int n = atoi(argv[1]);
      printf("f(%d) = %d\n", n, f(n));
      return EXIT_SUCCESS;
    }
    

    Kompiliert wird es wieder mit der -g-Option.

    gcc -g -o demo1 demo1.c
    

    Wir starten das Programm im Debugger gdb --args ./demo 8 und setzen direkt ein break auf die f-Funktion.

    (gdb) break f
    Breakpoint 1 at 0x1154: file demo1.c, line 5.
    

    Lässt man das Programm eine paar Schritte laufen, kommt folgendes raus:

    (gdb) bt
    #0  f (n=3) at demo1.c:7
    #1  0x000055555555516e in f (n=4) at demo1.c:7
    #2  0x000055555555516e in f (n=5) at demo1.c:7
    #3  0x000055555555516e in f (n=6) at demo1.c:7
    #4  0x000055555555516e in f (n=7) at demo1.c:7
    #5  0x000055555555516e in f (n=8) at demo1.c:7
    #6  0x00005555555551b0 in main (argc=2, argv=0x7fffffffe1d8) at demo1.c:15
    
    • chevron_right

      Debugger - backtrace

      pubsub.movim.eu / devlug • 30 November 2025

    Wir nehmen als Beispiel folgendes Programm.

    #include <stdio.h>
    #include <stdlib.h>
    
    int f(int n) {
      if (n == 0)
        return 1;
      return n * f(n - 1);
    }
    
    int main(int argc, char *argv[]) {
      if (argc < 2) {
        return EXIT_FAILURE;
      }
      int n = atoi(argv[1]);
      printf("f(%d) = %d\n", n, f(n));
      return EXIT_SUCCESS;
    }
    

    Kompiliert wird es wieder mit der -g-Option.

    gcc -g -o demo1 demo1.c
    

    Wir starten das Programm im Debugger gdb --args ./demo 8 und setzen direkt ein break auf die f-Funktion.

    (gdb) break f
    Breakpoint 1 at 0x1154: file demo1.c, line 5.
    

    Lässt man das Programm eine paar Schritte laufen, kommt folgendes raus:

    (gdb) bt
    #0  f (n=3) at demo1.c:7
    #1  0x000055555555516e in f (n=4) at demo1.c:7
    #2  0x000055555555516e in f (n=5) at demo1.c:7
    #3  0x000055555555516e in f (n=6) at demo1.c:7
    #4  0x000055555555516e in f (n=7) at demo1.c:7
    #5  0x000055555555516e in f (n=8) at demo1.c:7
    #6  0x00005555555551b0 in main (argc=2, argv=0x7fffffffe1d8) at demo1.c:15
    
    • chevron_right

      Debuggen

      pubsub.movim.eu / devlug • 30 November 2025 edit • 1 minute

    Quellcode für ein Demo Programm

    #include <stdio.h>
    #include <stdlib.h>
    
    int addiere(int a, int b) {
      int x = a;
      int y = b;
      int z = x + y;
      return z;
    }
    
    void berechne(int argc, char *argv[]) {
      int a = 0;
      int b = 0;
    
      if (argc > 2) {
        a = atoi(argv[1]);
        b = atoi(argv[2]);
      } else {
        printf("a = ");
        scanf("%d", &a);
        printf("b = ");
        scanf("%d", &b);
      }
      int c = addiere(a, b);
      printf("%d + %d = %d\n", a, b, c);
    }
    
    int main(int argc, char *argv[]) {
      for (int i = 0; i < argc; i++) {
        printf("argv[%d] %s\n", i, argv[i]);
      }
      berechne(argc, argv);
      return EXIT_SUCCESS;
    }
    

    Compilieren:

    gcc -Wall -Werror -Wextra -g -o demo main.c
    

    Debuggen

    gdb ./demo
    (gdb) break main
    Breakpoint 1 at 0x126e: file main.c, line 29.
    (gdb) run
    Breakpoint 1, main (argc=1, argv=0x7fffffffe1e8) at main.c:29
    29	  for (int i = 0; i < argc; i++) {
    
    • print zeigt einen Wert einer Variable ( print argv[0] )
    • next für den nächsten Befehl im Quellcode - aber nicht in Funktionen
    • step für den nächsten Befehl im Quellcode und spring in Funktionen
    (gdb) n
    32	  berechne(argc, argv);
    (gdb) s
    berechne (argc=1, argv=0x7fffffffe1e8) at main.c:12
    12	  int a = 0;
    
    • chevron_right

      Debuggen

      pubsub.movim.eu / devlug • 30 November 2025 edit • 1 minute

    Quellcode für ein Demo Programm

    #include <stdio.h>
    #include <stdlib.h>
    
    int addiere(int a, int b) {
      int x = a;
      int y = b;
      int z = x + y;
      return z;
    }
    
    void berechne(int argc, char *argv[]) {
      int a = 0;
      int b = 0;
    
      if (argc > 2) {
        a = atoi(argv[1]);
        b = atoi(argv[2]);
      } else {
        printf("a = ");
        scanf("%d", &a);
        printf("b = ");
        scanf("%d", &b);
      }
      int c = addiere(a, b);
      printf("%d + %d = %d\n", a, b, c);
    }
    
    int main(int argc, char *argv[]) {
      for (int i = 0; i < argc; i++) {
        printf("argv[%d] %s\n", i, argv[i]);
      }
      berechne(argc, argv);
      return EXIT_SUCCESS;
    }
    

    Compilieren:

    gcc -Wall -Werror -Wextra -g -o demo main.c
    

    Debuggen

    gdb ./demo
    (gdb) break main
    Breakpoint 1 at 0x126e: file main.c, line 29.
    (gdb) run
    Breakpoint 1, main (argc=1, argv=0x7fffffffe1e8) at main.c:29
    29	  for (int i = 0; i < argc; i++) {
    
    • print zeigt einen Wert einer Variable ( print argv[0] )
    • next für den nächsten Befehl im Quellcode - aber nicht in Funktionen
    • step für den nächsten Befehl im Quellcode und spring in Funktionen
    (gdb) n
    32	  berechne(argc, argv);
    (gdb) s
    berechne (argc=1, argv=0x7fffffffe1e8) at main.c:12
    12	  int a = 0;
    
    • chevron_right

      Debuggen

      pubsub.movim.eu / devlug • 30 November 2025 edit • 1 minute

    Quellcode für ein Demo Programm

    #include <stdio.h>
    #include <stdlib.h>
    
    int addiere(int a, int b) {
      int x = a;
      int y = b;
      int z = x + y;
      return z;
    }
    
    void berechne(int argc, char *argv[]) {
      int a = 0;
      int b = 0;
    
      if (argc > 2) {
        a = atoi(argv[1]);
        b = atoi(argv[2]);
      } else {
        printf("a = ");
        scanf("%d", &a);
        printf("b = ");
        scanf("%d", &b);
      }
      int c = addiere(a, b);
      printf("%d + %d = %d\n", a, b, c);
    }
    
    int main(int argc, char *argv[]) {
      for (int i = 0; i < argc; i++) {
        printf("argv[%d] %s\n", i, argv[i]);
      }
      berechne(argc, argv);
      return EXIT_SUCCESS;
    }
    

    Compilieren:

    gcc -Wall -Werror -Wextra -g -o demo main.c
    

    Debuggen

    gdb ./demo
    (gdb) break main
    Breakpoint 1 at 0x126e: file main.c, line 29.
    (gdb) run
    Breakpoint 1, main (argc=1, argv=0x7fffffffe1e8) at main.c:29
    29	  for (int i = 0; i < argc; i++) {
    
    • print zeigt einen Wert einer Variable ( print argv[0] )
    • next für den nächsten Befehl im Quellcode - aber nicht in Funktionen
    • step für den nächsten Befehl im Quellcode und spring in Funktionen
    (gdb) n
    32	  berechne(argc, argv);
    (gdb) s
    berechne (argc=1, argv=0x7fffffffe1e8) at main.c:12
    12	  int a = 0;
    
    • chevron_right

      Hello World - gtk4

      pubsub.movim.eu / devlug • 30 November 2025 • 1 minute

    Hier mal ein kleines und einfaches Beispiel in gtk4. Compiliert und läuft.

    #include <gtk/gtk.h>
    
    static void click_an(GtkButton *button, gpointer user_data) {
      g_assert(button);
      gtk_entry_buffer_set_text(gtk_entry_get_buffer(user_data), "an", -1);
    }
    
    static void click_aus(GtkButton *button, gpointer user_data) {
      g_assert(button);
      gtk_entry_buffer_set_text(gtk_entry_get_buffer(user_data), "aus", -1);
    }
    
    static void activate(GtkApplication *app, gpointer user_data) {
      GtkWidget *window;
      window = gtk_application_window_new(app);
      gtk_window_set_title(GTK_WINDOW(window), "Demo");
      gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
      gtk_window_present(GTK_WINDOW(window));
      GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 30);
      gtk_box_get_homogeneous(GTK_BOX(box));
      GtkWidget *an = gtk_button_new_with_label("An");
      GtkWidget *aus = gtk_button_new_with_label("Aus");
      GtkWidget *text = gtk_entry_new();
      gtk_box_append(GTK_BOX(box), an);
      gtk_box_append(GTK_BOX(box), aus);
      gtk_box_append(GTK_BOX(box), text);
      gtk_window_set_child(GTK_WINDOW(window), box);
      g_signal_connect(GTK_BUTTON(an), "clicked", G_CALLBACK(click_an), text);
      g_signal_connect(GTK_BUTTON(aus), "clicked", G_CALLBACK(click_aus), text);
    }
    
    int main(int argc, char *argv[]) {
      GtkApplication *app;
      int status;
      app = gtk_application_new("de.devlug.sandbox.demo",
                                G_APPLICATION_DEFAULT_FLAGS);
      g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
      status = g_application_run(G_APPLICATION(app), argc, argv);
      g_object_unref(app);
      return status;
    }
    

    #Linux #gtk #gtk4

    • chevron_right

      Hello World - gtk4

      pubsub.movim.eu / devlug • 30 November 2025 • 1 minute

    Hier mal ein kleines und einfaches Beispiel in gtk4. Compiliert und läuft.

    #include <gtk/gtk.h>
    
    static void click_an(GtkButton *button, gpointer user_data) {
      g_assert(button);
      gtk_entry_buffer_set_text(gtk_entry_get_buffer(user_data), "an", -1);
    }
    
    static void click_aus(GtkButton *button, gpointer user_data) {
      g_assert(button);
      gtk_entry_buffer_set_text(gtk_entry_get_buffer(user_data), "aus", -1);
    }
    
    static void activate(GtkApplication *app, gpointer user_data) {
      GtkWidget *window;
      window = gtk_application_window_new(app);
      gtk_window_set_title(GTK_WINDOW(window), "Demo");
      gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
      gtk_window_present(GTK_WINDOW(window));
      GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 30);
      gtk_box_get_homogeneous(GTK_BOX(box));
      GtkWidget *an = gtk_button_new_with_label("An");
      GtkWidget *aus = gtk_button_new_with_label("Aus");
      GtkWidget *text = gtk_entry_new();
      gtk_box_append(GTK_BOX(box), an);
      gtk_box_append(GTK_BOX(box), aus);
      gtk_box_append(GTK_BOX(box), text);
      gtk_window_set_child(GTK_WINDOW(window), box);
      g_signal_connect(GTK_BUTTON(an), "clicked", G_CALLBACK(click_an), text);
      g_signal_connect(GTK_BUTTON(aus), "clicked", G_CALLBACK(click_aus), text);
    }
    
    int main(int argc, char *argv[]) {
      GtkApplication *app;
      int status;
      app = gtk_application_new("de.devlug.sandbox.demo",
                                G_APPLICATION_DEFAULT_FLAGS);
      g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
      status = g_application_run(G_APPLICATION(app), argc, argv);
      g_object_unref(app);
      return status;
    }
    

    #Linux #gtk #gtk4

    • chevron_right

      Hello World - gtk4

      pubsub.movim.eu / devlug • 30 November 2025 • 1 minute

    Hier mal ein kleines und einfaches Beispiel in gtk4. Compiliert und läuft.

    #include <gtk/gtk.h>
    
    static void click_an(GtkButton *button, gpointer user_data) {
      g_assert(button);
      gtk_entry_buffer_set_text(gtk_entry_get_buffer(user_data), "an", -1);
    }
    
    static void click_aus(GtkButton *button, gpointer user_data) {
      g_assert(button);
      gtk_entry_buffer_set_text(gtk_entry_get_buffer(user_data), "aus", -1);
    }
    
    static void activate(GtkApplication *app, gpointer user_data) {
      GtkWidget *window;
      window = gtk_application_window_new(app);
      gtk_window_set_title(GTK_WINDOW(window), "Demo");
      gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
      gtk_window_present(GTK_WINDOW(window));
      GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 30);
      gtk_box_get_homogeneous(GTK_BOX(box));
      GtkWidget *an = gtk_button_new_with_label("An");
      GtkWidget *aus = gtk_button_new_with_label("Aus");
      GtkWidget *text = gtk_entry_new();
      gtk_box_append(GTK_BOX(box), an);
      gtk_box_append(GTK_BOX(box), aus);
      gtk_box_append(GTK_BOX(box), text);
      gtk_window_set_child(GTK_WINDOW(window), box);
      g_signal_connect(GTK_BUTTON(an), "clicked", G_CALLBACK(click_an), text);
      g_signal_connect(GTK_BUTTON(aus), "clicked", G_CALLBACK(click_aus), text);
    }
    
    int main(int argc, char *argv[]) {
      GtkApplication *app;
      int status;
      app = gtk_application_new("de.devlug.sandbox.demo",
                                G_APPLICATION_DEFAULT_FLAGS);
      g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
      status = g_application_run(G_APPLICATION(app), argc, argv);
      g_object_unref(app);
      return status;
    }
    

    #Linux #gtk #gtk4