gdb如何影响sem_post / sem_wait?

时间:2019-02-20 07:35:36

标签: gdb semaphore

背景

处理“捕获”

  1. 该进程是在网络设备上运行的守护进程,该设备运行Linux 2.6.39-gentoo

  2. 该进程包含n + 1个线程,线程(1-n)从内核接收数据包,线程0将数据包发送到另一个进程。

  3. 当用户想要捕获数据包时,他们告诉数据包编号以“捕获”,然后thread1-n进行捕获数据包的工作,因为它们捕获了一个数据包,所以将数据包推入队列。然后 sem_post(&sync_sem);

  4. 线程0 sem_wait(&sync_sem),并从队列中弹出数据包,然后通过套接字发送到“ recv”进程。

问题

  1. 在大多数情况下,过程“捕获”都能正常工作。但是一位客户报告说该程序在一段时间后没有捕获任何东西。而且从那时起就无法捕获任何东西。
  2. 我登录了设备,似乎进程“ recv”没有任何内容。 gdb附加到进程“ recv”,一切正常。在杀死进程“ recv”并重新启动它之后,仍然无法正常工作。因此与流程“ recv”无关。
  3. 在挖掘“捕获”进程时,为了查看某些全局参数而不停止该进程,我键入 [gdb -p {capture_pid} -q -n -ex'p {g_paramer}'-batch] < / strong>,令人惊讶的是,进程“ recv”立即获得了数据包编号(1000)。
  4. 由于设备的pps仅约为10,因此这意味着从“捕获”到“ recv”的套接字路径是好的,并且1000个数据包已经被推入队列。 thread1-n都没有通知线程0(这意味着sem_post出了问题),也不是线程0没有得到通知(这意味着sem_wait出了问题)

问题

所以我的问题是:gdb如何恢复所有内容?

根本无法重现该问题,欢迎您提出任何建议。

0 个答案:

没有答案