簡體   English   中英

gdb是否會立即停止所有線程?

[英]Does gdb stops ALL THREADS immediately?

我有無法解釋的非常奇怪的情況。 在代碼中:

Env = Global.Queue2Ctrl.FIFO(100);//Wait for a msg for 100ms
if (Env == 0) continue; //Timeout
printf("i=%d %x\n",++i, (Env->Msg));
if (!Env->Msg)
  BreakP();
....

出於此問題的目的:每100ms的其他線程從池中獲取並填充Env結構(包括指向Msg的指針)。 然后,它通過FIFO發送Env指針。 該線程處理Env並將其返回到池中。

在成千上萬的周期中,一旦出現斷點,我就知​​道可能是因為我正在尋找一些錯誤。 恕我直言,當我在Env-Msg變量上查找gdb(不執行步進!)時,它不是零!! Printf打印零,我輸入if子句,但是gdb顯示“正常”值。 我可以在5-7分鍾內重現一次情況,並且gdb總是顯示出良好的價值嗎? 如果這是競爭狀態,那么當兩個線程都基於超時時,如何在一個匯編程序命令中精確地做到這一點?

gdb是否會立即停止所有線程

在Linux上,一旦一個線程收到SIGTRAP (由於斷點觸發),GDB必須停止所有其他線程(通過遍歷GDB知道的線程列表,並將SIGSTOP發送給每個線程)。

如果Env被兩個線程之間共享,這是很可能的Env->MsgNULLif條件進行評估,但要成為非NULL的時候GDB給你提示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM