Valgrind zeigt trotz Flag -g keine Zeilennummern an (unter Ubuntu 11.10/VirtualBox)

Lesezeit: 7 Minuten

Benutzeravatar von djb
djb

Ich verfolge insbesondere ‘Learn C the Hard Way’ das Kapitel über Valgrind. Dieses Kapitel gibt Ihnen ein absichtlich falsches Programm, um zu zeigen, wie Valgrind funktioniert.

Wenn ich die Übung unter Valgrind ausführe, erhalte ich keine Zeilennummern in meinem Stack-Trace, nur ‘(below main)’ für die Fehler.

Ich bin bestimmt Kompilieren mit dem Flag -g.

Meine Valgrind-Ausgabe lautet wie folgt:

djb@twin:~/projects/Learning/C$ valgrind ./ex4
==5190== Memcheck, a memory error detector
==5190== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==5190== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==5190== Command: ./ex4
==5190== 
==5190== Use of uninitialised value of size 4
==5190==    at 0x4078B2B: _itoa_word (_itoa.c:195)
==5190==    by 0x407CE55: vfprintf (vfprintf.c:1619)
==5190==    by 0x40831DE: printf (printf.c:35)
==5190==    by 0x4052112: (below main) (libc-start.c:226)
==5190== 
==5190== Conditional jump or move depends on uninitialised value(s)
==5190==    at 0x4078B33: _itoa_word (_itoa.c:195)
==5190==    by 0x407CE55: vfprintf (vfprintf.c:1619)
==5190==    by 0x40831DE: printf (printf.c:35)
==5190==    by 0x4052112: (below main) (libc-start.c:226)
==5190== 
==5190== Conditional jump or move depends on uninitialised value(s)
==5190==    at 0x407CC10: vfprintf (vfprintf.c:1619)
==5190==    by 0x40831DE: printf (printf.c:35)
==5190==    by 0x4052112: (below main) (libc-start.c:226)
==5190== 
==5190== Conditional jump or move depends on uninitialised value(s)
==5190==    at 0x407C742: vfprintf (vfprintf.c:1619)
==5190==    by 0x40831DE: printf (printf.c:35)
==5190==    by 0x4052112: (below main) (libc-start.c:226)
==5190== 
I am 0 years old.
I am 68882420 inches tall.
==5190== 
==5190== HEAP SUMMARY:
==5190==     in use at exit: 0 bytes in 0 blocks
==5190==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==5190== 
==5190== All heap blocks were freed -- no leaks are possible
==5190== 
==5190== For counts of detected and suppressed errors, rerun with: -v
==5190== Use --track-origins=yes to see where uninitialised values come from
==5190== ERROR SUMMARY: 22 errors from 4 contexts (suppressed: 11 from 6)

Ich verwende Ubuntu 11.10 in einer VirtualBox-VM.

Vielen Dank für jede Hilfe.

Aktualisieren

Es scheint, dass wenn ich eine Funktion aus aufrufe main() und diese Funktion einen Fehler enthält (z. B. eine nicht initialisierte Variable), dann I tun Erhalten Sie eine Ablaufverfolgung zu dem Ort, an dem die Funktion aufgerufen wurde main(). Jedoch Fehler innerhalb main() bleiben unbestimmt. Sehen diese Paste zum Beispiel.

  • Bitte erstellen Sie ein neues, leeres Verzeichnis und platzieren Sie in diesem Verzeichnis, was Sie finden pastebin.com/A6bK2hdw ; Es ist ein Bash-Skript, das versucht, das Problem zu reproduzieren. Wenn ich es ausführe, erhalte ich eine Ausgabe wie das, was Sie sehen können pastebin.com/JncWz2GF , was Ihr Tutorial sagt, sollten Sie bekommen. Betreiben Sie es selbst. Wenn Sie die richtige Ausgabe erhalten, stellen Sie fest, wie sich Ihre Vorgehensweise von diesem Shell-Skript unterscheidet. Wenn Sie dieses Shell-Skript ausführen und die falsche Ausgabe erhalten, wie Sie es oben gezeigt haben, kommen Sie zurück und lassen Sie uns darüber diskutieren.

    – Bill Evans bei Mariposa

    17. Februar 2012 um 4:53 Uhr

  • Hallo @Bill, danke für deine Hilfe. Beim Ausführen Ihres Skripts erhalte ich die gleiche Ausgabe plus eine Warnung über die Zeitverschiebung. http://pastebin.com/fjfPrLts

    – DJB

    17. Februar 2012 um 10:01 Uhr

  • Ich habe dasselbe Problem, dasselbe Betriebssystem, dieselbe VirtualBox-VM. Ich habe Valgrind 3.6.1 und 3.7.0 ausprobiert und keines zeigt Zeilennummern mit der Option -g an.

    – Chris

    17. Februar 2012 um 15:43 Uhr

  • Ich vermute, dass das Problem etwas mit VirtualBox selbst zu tun hat. Mit VirtualBox kenne ich mich nicht aus. Ich empfehle, dass Sie Ihrer Frage das VirtualBox-Tag hinzufügen und sehen, ob etwas auftaucht. Wenn das nicht hilft, schauen Sie, ob die Leute bei forums.virtualbox.org kann helfen. Ich wünschte, ich könnte Ihnen mehr helfen. Es tut uns leid.

    – Bill Evans bei Mariposa

    18. Februar 2012 um 0:11 Uhr

  • Ich habe gerade dieselbe Version unter Mac OSX getestet wie mein Ubuntu/VBox-Setup, und es funktioniert perfekt auf dem Mac. Ich denke, Bill könnte Recht haben, es ist entweder etwas mit VBox oder etwas mit Ubuntu.

    – Chris

    18. Februar 2012 um 0:34 Uhr

Die Ausgabe, die Sie in Ihrer Frage bereitgestellt haben, enthält die folgende Zeile:

==5190== Use --track-origins=yes to see where uninitialised values come from

Laut dieser Nachricht sollten Sie laufen ./ex4 so was:

valgrind --track-origins=yes ./ex4

Um einige Probleme mit Valgrind zu vermeiden, die keine Debug-Informationen finden können, können Sie statische Verknüpfungen verwenden:

gcc -static -g  -o ex4  ex4.c 

Die Ausgabe von Valgrind enthält dann Nachrichten wie Uninitialised value was created by a stack allocation:

==17673== Memcheck, a memory error detector
==17673== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==17673== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==17673== Command: ./ex4
...
==17673== Use of uninitialised value of size 4
==17673==    at 0x805CA7B: _itoa_word (in /home/user/ex4)
==17673==    by 0x8049D5F: printf (in /home/user/ex4)
==17673==    by 0x8048ECD: main (ex4.c:8)
==17673==  Uninitialised value was created by a stack allocation
==17673==    at 0x8048EFA: bad_function (ex4.c:17)
...
==17673== Use of uninitialised value of size 4
==17673==    at 0x805CA7B: _itoa_word (in /home/user/ex4)
==17673==    by 0x8049D5F: printf (in /home/user/ex4)
==17673==    by 0x80490BE: (below main) (in /home/user/ex4)
==17673==  Uninitialised value was created by a stack allocation
==17673==    at 0x8048EBE: main (ex4.c:4)
...
I am -1094375076 years old.
...
I am -1094369310 inches tall.
...
==17673== 
==17673== HEAP SUMMARY:
==17673==     in use at exit: 0 bytes in 0 blocks
==17673==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==17673== 
==17673== All heap blocks were freed -- no leaks are possible
==17673== 
==17673== For counts of detected and suppressed errors, rerun with: -v
==17673== ERROR SUMMARY: 83 errors from 21 contexts (suppressed: 0 from 0)

Datei ex4.c:

 1  #include <stdio.h>
 2
 3  int main()
 4  {
 5          int age = 10;
 6          int height;
 7
 8          bad_function();
 9
10          printf("I am %d years old.\n");
11          printf("I am %d inches tall.\n", height);
12
13          return 0;
14  }
15
16  int bad_function() 
17  {
18          int x;
19          printf("%d\n", x);
20  }

Valgrinds Ausgabe ist nicht ideal. Es identifiziert den Stapelrahmen (Funktion), der die nicht initialisierte Variable enthält, aber es gibt nicht den Namen der Variablen aus.

Das Ausführen von Linux unter VirtualBox hat keine Auswirkungen auf Valgrind.

  • Selbst wenn Sie Leseunterricht gehabt hätten, hätten Sie Ihr Problem immer noch nicht gelöst. Diese Antwort löst nichts. Die Ausgabe von Valgrind im Tutorial gibt die Zeile an, in der die nicht initialisierte Variable verwendet wird. Das unterscheidet sich stark von der Ausgabe durch –track-origins=yes … und da das ursprüngliche Problem darin bestand, die gleiche Ausgabe wie die Tutorials auf Ubuntu zu erhalten, sollte die Frage immer noch offen sein … übrigens das gleiche Problem läuft genau auf Ubuntu 11.10 (nicht über eine VM) mit valgrind 3.7.0.

    – justin

    8. Juni 2012 um 17:38 Uhr


Benutzeravatar von Jason Denney
Jason Denney

Ich habe auch mit kompiliert -g Flag und bekomme immer noch keine Zeilennummern. Nach dem Entfernen der .dSYM Verzeichnis für meine App und Ausführen von valgrind mit der --dsymutil=yes Option habe ich endlich Zeilennummern.

  • Das ist nur für OS X.

    – Lenar Hoyt

    15. Dezember 2015 um 22:38 Uhr

  • valgrind --track-origins=yes --dsymutil=yes ./FILE_NAME funktioniert der Trick in Ubuntu, und ich habe mit kompiliert -g Flagge

    – Minh Triet

    16. Dezember 2015 um 0:26 Uhr


Benutzeravatar von wilsaj
wilsaj

Auf vielen Distributionen enthält die Standardversion von glibc keine Debug-Symbole.

Versuchen Sie, das Paket libc6-dbg zu installieren.

Sie sollten es mit “-g” kompilieren. gcc -g test.c -o test und dann valgrind –track-origins=yes –leak-check=full ./test

Beachten Sie, dass das Ausführen von valgrind mit der Lösung –dsymutil=yes nur für Mac OS X gilt.

Laut den Dokumenten:

dsymutil=nein|ja [no]
Diese Option ist nur relevant, wenn Valgrind unter Mac OS X ausgeführt wird.

Mac OS X verwendet ein Verknüpfungsschema für verzögerte Debug-Informationen (debuginfo). Wenn Objektdateien, die Debuginfos enthalten, in eine .dylib oder eine ausführbare Datei gelinkt werden, werden die Debuginfos nicht in die endgültige Datei kopiert. Stattdessen muss die Debuginfo manuell verknüpft werden, indem dsymutil, ein vom System bereitgestelltes Dienstprogramm, auf der ausführbaren Datei oder .dylib ausgeführt wird. Die resultierende kombinierte Debuginfo wird in einem Verzeichnis neben der ausführbaren Datei oder .dylib abgelegt, jedoch mit der Erweiterung .dSYM.

Benutzeravatar von feedbackloop
Rückkopplungsschleife

Ich habe dieses Problem verfolgt und keine der anderen Antworten hat funktioniert. Meine Ausgabe zeigte die richtigen Symbole an, aber Zeilennummern waren nicht vorhanden.

In meinem Fall lag es an der fraglichen Bibliothek, die .zdebug-komprimierte Zeilennummerninformationen verwendete, und die Version von valgrind, die ich verwendete, war alt und hatte noch nicht den erforderlichen Patch [0].

Die Lösung bestand darin, valgrind auf die neueste Version zu aktualisieren.

[0] https://bugs.kde.org/show_bug.cgi?id=303877

Benutzeravatar von Mujju
Mujju

versuche gcc nicht cc

cc stellt die Zeilennummern nicht bereit, aber gcc schon

  • cc ist nur ein symbolischer Link zum System-C-Compiler, der höchstwahrscheinlich ohnehin GCC sein wird.

    – Oliver Tušla

    29. April 2021 um 5:55 Uhr

1415970cookie-checkValgrind zeigt trotz Flag -g keine Zeilennummern an (unter Ubuntu 11.10/VirtualBox)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy