如何使用GDB调试多线程程序?

时间:2016-05-07 18:20:29

标签: c multithreading gdb scanf race-condition

我正在编写一个2线程程序,其中一个写线程和一个读线程同时访问磁盘上的文件。写入线程可以(1)从磁盘读取并创建新文件,这样,它(2)删除旧文件,并将新文件(tmp)重命名为旧文件名。新文件始终大于旧文件。在案例(1)期间,读取线程从文件读取。

但是,当新文件小于旧文件时,读取中的fscanf会产生No such file or directory seg错误。我确定了写线程正在调用的函数,但我想知道写线程当前正在执行哪个语句,以及局部变量值。功能很大所以printf每个语句都不实用。如何使用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

1 个答案:

答案 0 :(得分:2)

  

我想知道写线程当前正在执行哪个语句,以及局部变量值

鉴于您的堆栈跟踪,当前语句是lib.c的第887行的任何内容。

以下命令序列将让您查看局部变量的值:

(gdb) frame 1
(gdb) info locals