Frage

ich auf einem Stück Code arbeite, die regulären Ausdrücke in c verwendet wird.

Alle von dem Regex Zeug wird unter Verwendung der Standard-regex c-Bibliothek.

In Zeile 246 von regexec.c, die Linie

__libc_lock_lock(dfa->lock);

Mein Programm ist hier Speicherzugriffsfehler und ich kann nicht herausfinden, warum. Ich habe versucht, zu finden, wo __libc_lock_lock definiert wurde und es stellt sich heraus, es ist ein Makro in Bits / libc-lock.h. Tatsächlich ist jedoch das Makro ist nicht definiert, etwas zu sein, genau definiert.

Zwei Fragen:

1) Wo ist der Code, der ausgeführt wird, wenn __libc_lock_lock genannt wird (ich weiß, es muss sein       ersetzt mit etwas, aber ich weiß nicht, wo das sein würde.

2), wenn ein DFA re_dfa_t Objekt ist, das aus einem C-String gegossen wird, die das Pufferelement des regex_t Objekttypen ist, wird es kein Mitglied Sperre hat. Ist es das, was geschehen soll.

Es scheint, wirklich, wie es irgendeine Art von Magie ist denn hier los mit diesem __libc_lock_lock

War es hilfreich?

Lösung

Wenn die segfault ist in libc , dann können Sie zu 99,9% sicher der folgenden sein:

  1. Sie etwas falsch mit der API zu tun
  2. Sie haben zu einem frühen Punkt verprügelt oder beschädigt Speicher von libc verwendet wird, und dies ist eine verzögerte Wirkung. (Danke Tyler!)
  3. Sie tun etwas, das die API-Fähigkeit drückt
  4. Sie sind ein Entwickler den aktuellen Stamm mit neuen Änderungen in der API-Implementierung testen

Ich vermute, dass die erste die Ursache ist. Buchen Sie Ihre API-Nutzung und Ihre Bibliothek Version könnte helfen. Die Regexp API in libc ist ziemlich stabil.

Sehen Sie das Debuggen mit gdb finden ein Stack-Trace der Pfad Ausführung an den segfault führt, und installieren Sie die glibc-devel-Pakete für die Symbole. Wenn die segfault in (oder aus) von libc sind ... dann haben Sie etwas schlecht gemacht (nicht einen undurchsichtigen Zeiger zum Beispiel initialisiert)

[aiden@devbox ~]$ gdb ./myProgram
(gdb) r
... Loads of stuff, segfault info ..
(gdb) bt

Wird der Stapel und Funktionsnamen drucken, die auf dem SEGAULT geführt. Stellen Sie sich Ihre Quelle mit der ‚-g‘ Debugflag wichtigen Debug-Informationen zu halten.

Erhalten Sie eine maßgebliche Quelle für API-Nutzung / Beispiele!

Good Luck

Andere Tipps

In Antwort auf Ihre erste Frage:

Das Makro wird in den libc-lock.h definiert; sein relativer Pfad wird auf sysdeps/mach/bits die glibc-Release Ich benutze (2.2.5). 67/68 Zeilen aus dieser Datei sind

/* Lock the named lock variable.  */
#define __libc_lock_lock(NAME) __mutex_lock (&(NAME))

Führen Sie den Code in GDB, bis Sie zum segfault bekommen. Dann hat ein Backtrace, um herauszufinden, wo es war.

Hier ist der Satz von Befehlen wird geben Sie dies zu tun:

gdb myprogram
run
***Make it crash***
backtrace

Typing Backtrace wird den Call-Stack drucken und Ihnen zeigen, welchen Weg der Code auf den Punkt zu kommen genommen, wo sie Speicherzugriffsfehler.

Sie kann nach oben und unten in dem Stapel, um Ihren Code von jeweils ‚up‘ oder ‚down‘ eingeben. Dann können Sie Variablen in diesem Rahmen untersuchen.

So zum Beispiel, wenn Ihr Backtrace Befehl druckt diese:

linux_black_magic
more_linux
libc
libc
yourcode.c

Typ ‚up‘ ein paar Mal, so dass der Stapelrahmen in Ihrem Code ist anstelle von Linux. Anschließend können Sie Variablen und Speicher untersuchen, die Ihr Programm auf arbeitet. Tun Sie dies:

print VariableName
x/10 &Variable

Das wird den Wert der Variablen drucken und dann auf die Variable Starten eines Hex-Dump des Speichers wird gedruckt.

Das sind einige allgemeine Techniken mit GDB und Debuggen zu verwenden, schreiben mehr Details für detailliertere Antworten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top