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

How to use GDB to debug multithreaded program?

我正在编写一个 2 线程程序,其中一个写入线程和一个读取线程可以同时访问磁盘上的文件。写入线程可以 (1) 从磁盘读取并创建一个新文件,并且 (2) 删除旧文件,并将新文件 (tmp) 重命名为旧文件名。新文件总是比旧文件大。读取线程在情况 (1) 期间从文件中读取。

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

I wish to know which statement that write thread is executing at the moment, and the local variable values

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

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

(gdb) frame 1
(gdb) info locals