Я пишу программу с двумя потоками, в которой один поток записи и один прочитанный поток имеют одновременный доступ к файлу на диске. Поток записи может (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
сообщение «нет такого файла или каталога» не связано с ошибкой вашей программы. Это просто означает, что у вашей системы нет исходного кода для fscanf. Исходный код для системных библиотек не является обязательным. Какая операционная система у вас есть? Мы можем рассказать вам, как загрузить исходный код libc. (В этом случае нам не нужен исходный код, чтобы увидеть ошибку: ваша программа с именем fscanf с указателем NULL. Основная причина этого - вызывать 'fopen' в несуществующем файле). –
Привет, Марк, fscanf работал много раз перед сбоем seg. Любопытно то, что до и после файла seg сбой, я проверил, есть ли файл (просто глядя, существует ли файл в папке, к которой обращаются), он есть. Поэтому я действительно озадачен. – Pippi
Вот что делает многопоточные программы более сложными: ошибки могут отображаться, казалось бы, случайным образом, в зависимости от относительного времени потоков. В любом случае, введите 'up', чтобы перейти в стек стека функции' binary_search_in_ disk' и посмотреть на значения его переменных. Найти, где этому указателю FILE * присваивается значение NULL. –