2016-05-07 4 views
0

Я пишу программу с двумя потоками, в которой один поток записи и один прочитанный поток имеют одновременный доступ к файлу на диске. Поток записи может (1) считывать с диска и создавать новый файл, и это, он (2) удалить старый файл и переименовать новый файл (tmp) в старое имя файла. Новый файл всегда больше старого. Поток чтения читается из файла в случае (1).Как использовать GDB для отладки многопоточной программы?

Однако fscanf in read производит ошибку ошибки No such file or directory seg, когда новый файл меньше старого. Я определил функцию, которая вызывает поток записи, но я хочу знать, какой оператор, который пишет поток, выполняется в настоящий момент, и значения локальной переменной. Функция большая, поэтому нецелесообразно печатать каждое утверждение. Как я могу это узнать, используя GDB?

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

сообщение «нет такого файла или каталога» не связано с ошибкой вашей программы. Это просто означает, что у вашей системы нет исходного кода для fscanf. Исходный код для системных библиотек не является обязательным. Какая операционная система у вас есть? Мы можем рассказать вам, как загрузить исходный код libc. (В этом случае нам не нужен исходный код, чтобы увидеть ошибку: ваша программа с именем fscanf с указателем NULL. Основная причина этого - вызывать 'fopen' в несуществующем файле). –

+0

Привет, Марк, fscanf работал много раз перед сбоем seg. Любопытно то, что до и после файла seg сбой, я проверил, есть ли файл (просто глядя, существует ли файл в папке, к которой обращаются), он есть. Поэтому я действительно озадачен. – Pippi

+0

Вот что делает многопоточные программы более сложными: ошибки могут отображаться, казалось бы, случайным образом, в зависимости от относительного времени потоков. В любом случае, введите 'up', чтобы перейти в стек стека функции' binary_search_in_ disk' и посмотреть на значения его переменных. Найти, где этому указателю FILE * присваивается значение NULL. –

ответ

2

Я хотел бы знать, какое утверждение, что написать нить выполняется в данный момент, и значения локальной переменной

Учитывая ваш трассировки стека, текущее утверждение, что находится на линии 887 lib.c.

Следующая последовательность команд позволит вам взглянуть на значения локальных переменных:

(gdb) frame 1 
(gdb) info locals