2016-05-07 12 views
0

Ich schreibe ein 2-Thread-Programm, in dem ein Schreib-Thread und ein Lese-Thread gleichzeitig auf eine Datei auf der Festplatte zugreifen. Der Schreib-Thread kann (1) von der Platte lesen und eine neue Datei erstellen, und dies (2) löscht die alte Datei und benennt die neue Datei (tmp) in den alten Dateinamen um. Die neue Datei ist immer größer als die alte Datei. Der Lese-Thread liest während case (1) aus der Datei.Wie verwende ich GDB, um Multithread-Programm zu debuggen?

Allerdings erzeugt fscanf in lesen No such file or directory Seg Fehler Fehler, wenn die neue Datei kleiner als die alte Datei ist. Ich habe die Funktion identifiziert, die der Schreib-Thread aufruft, aber ich möchte wissen, welche Anweisung der Schreib-Thread gerade ausführt und die lokalen Variablenwerte. Die Funktion ist groß, daher ist es nicht praktisch, jede Anweisung zu drucken. Wie kann ich das mit GDB herausfinden?

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0xb73ffb40 (LWP 12649)] 
__isoc99_fscanf (stream=0x0, format=0x804b5f1 "%d%d%d\n") at isoc99_fscanf.c:30 
30 isoc99_fscanf.c: No such file or directory. 
(gdb) bt 
#0 __isoc99_fscanf (stream=0x0, format=0x804b5f1 "%d%d%d\n") at isoc99_fscanf.c:30 
#1 0x0804ae18 in binary_search_in_disk (k_level=1, key=2) at lib.c:887 
#2 0x0804abbc in search (k_level=1, key=2) at lib.c:802 
#3 0x080490da in get (key=2) at lsm.c:56 
#4 0x08048dc9 in run_get (args=0x804e0c8) at concurrent_main.c:181 
#5 0xb7f71f70 in start_thread (arg=0xb73ffb40) at pthread_create.c:312 
#6 0xb7ea7bee in clone() at ../sysdeps/unix/sysv/linux/i386/clone.S:129 
+0

Die „keine solche Datei oder das Verzeichnis“ Nachricht wird nicht in Bezug auf Fehler Ihres Programms. Es bedeutet nur, dass Ihr System den Quellcode für fscanf nicht hat. Quellcode für Systembibliotheken ist optional. Welches Betriebssystem hast du? Wir können Ihnen sagen, wie Sie den libc-Quellcode herunterladen können. (In diesem Fall brauchen wir den Quellcode nicht, um den Fehler zu sehen: Ihr Programm heißt fscanf mit einem NULL-Zeiger. Die Hauptursache dafür ist das Aufrufen von 'fopen' in einer nicht vorhandenen Datei). –

+0

Hallo Markus, fscanf lief viele Male vor dem Seg Fehler. Das Seltsame ist, dass ich vor und nach dem Datei-Seg-Fehler überprüft habe, ob die Datei da ist (nur wenn die Datei in dem Ordner vorhanden ist, auf den zugegriffen wird), sie ist da. Ich bin wirklich verwirrt. – Pippi

+0

Das macht Multithread-Programme schwieriger: Fehler können scheinbar zufällig auftreten, abhängig vom relativen Timing der Threads. Wie auch immer, tippe 'up', um zum Stapelrahmen 'binary_search_in_ disk' zu gelangen und die Werte seiner Variablen zu betrachten. Finden Sie, wo der FILE * -Zeiger NULL zugewiesen wird. –

Antwort

2

Ich möchte wissen, welche Aussage die Thread schreiben im Moment ausgeführt wird, und die lokale Variable Werte

Ihre Stack-Trace ist angesichts der aktuellen Anweisung, was auf der Leitung 887 von lib.c.

Die folgende Sequenz von Befehlen finden Sie bei den Werten von lokalen Variablen aussehen lassen:

(gdb) frame 1 
(gdb) info locals 
Verwandte Themen