【问题标题】:GDB with pthreads带 pthread 的 GDB
【发布时间】:2011-09-30 12:03:50
【问题描述】:

我有一个 C 程序,其中 main 函数创建线程,我必须调试一个线程。我正在为他使用 gdb。但是,我不能在该程序的特定 C 文件上“破坏”或“监视”变量。例如。我的线程 6 已编程并使用某些 C 文件,我必须在 call_connect.c 上的第 601 行中断。这不可能吗?如果我尝试这样做,就会发生这种情况:

(gdb) info threads
  6 Thread 0xb5c96b70 (LWP 3608)  0xb7fe1424 in __kernel_vsyscall ()
  5 Thread 0xb6497b70 (LWP 3607)  0xb7fe1424 in __kernel_vsyscall ()
  4 Thread 0xb6c98b70 (LWP 3606)  0xb7fe1424 in __kernel_vsyscall ()
  3 Thread 0xb7499b70 (LWP 3605)  0xb7fe1424 in __kernel_vsyscall ()
  2 Thread 0xb7c9ab70 (LWP 3604)  0xb7fe1424 in __kernel_vsyscall ()
* 1 Thread 0xb7c9b6c0 (LWP 3603)  0x0804a178 in main ()

(gdb) break 601 thread 6
No line 601 in file "events.c".

(gdb) break call_connect.c:601 thread 6
No source file named call_connect.c.

我还使用 -O0 -ggdb 调试了我的 C 代码,但我仍然无法查看变量。 这是我尝试读取 char *ptext 变量时得到的结果。

(gdb) print ptext
No symbol "ptext" in current context.
(gdb) watch ptext
No symbol "ptext" in current context.

有人可以帮忙吗?

【问题讨论】:

    标签: c gdb pthreads


    【解决方案1】:

    虽然我没有广泛使用gdbpthreads,但我有一些建议您可以尝试一下。

    1. 您可以使用thread threadnum 切换到要调试的线程,其中threadnum 是通过info threads 显示的ID(第一列)。

    2. 检查正在查找文件的源目录中的文件 usinf show directories 命令。如果你的源码所在目录不在列表中,通过directory <path_to_source>命令添加

    3. 在设置断点或监视时使用自动完成(通常为<Tab>)来查找可以设置的断点和监视。

    请查看YoLinux pthreads Tutorials线程调试 部分下的链接以获取更多详细信息。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      你的问题是你的程序是在没有调试信息的情况下编译的。

      最可能的原因:call_connect.c 编译时没有 -ggdb 标志,尽管您声称(检查您的构建日志以验证这一点),或者您的链接行上有一个“流浪”-s(会剥离可执行文件)。

      【讨论】:

      • 当然,gdb 会在您加载二进制文件后告诉您是否找不到调试符号...?这不是一种快速验证二进制文件是否有调试符号的方法吗?
      • GDB 正在告诉你这一点。你认为No source file named call_connect.c 是什么意思?
      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2011-03-20
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多