簡體   English   中英

反正是否允許一個應用程序線程在GDB的斷點處繼續?

[英]Is there anyway to allow one application thread to continue while at a breakpoint in GDB?

在使用Apache Zookeeper C運行時庫調試應用程序時,在GDB中使用默認的全停止模式設置斷點時遇到問題。 由於Zookeeper線程無法運行,服務器將使會話超時,從而刪除您可能已創建的任何臨時znode。 使用非停止模式我可以防止這種情況發生,但是我無法檢查任何非Zookeeper線程的狀態。

GDB中是否有一種方法可以指定在遇到斷點時一個(或多個)線程將繼續在應用程序中運行,但其他線程是否會停止運行? 這樣我就可以檢查我關心的線程的狀態,並忽略那些我想在后台運行的狀態。

編輯:這實際上是不停止gdb中所有線程的重復。 那里使用帶有非停止模式的后台命令的解決方案基本上解決了我的問題,因為我可以隨時停止線程並異步重啟它們,所以也許我們應該關閉這個。

這有助於:

http://www.delorie.com/gnu/docs/gdb/gdb_25.html

看起來你可以做類似“thread apply [threadno] break lineno”的事情

您可以設置特定於線程的斷點:

(gdb) help break
Set breakpoint at specified line or function.
break [LOCATION] [thread THREADNUM] [if CONDITION]
LOCATION may be a line number, function name, or "*" and an address.
If a line number is specified, break at start of code for that line.
If a function is specified, break at start of code for that function.
If an address is specified, break at that exact address.
With no LOCATION, uses current execution address of the selected
stack frame.  This is useful for breaking on return to a stack frame.

THREADNUM is the number from "info threads".
CONDITION is a boolean expression.

使用Zookeeper,結果發現有一個hack可以執行,以便在gdb中斷時允許會話繼續。 這個hack利用了Zookeeper和gdb的一些屬性:

  • 您可以擁有多個具有相同會話ID的Zookeeper客戶端
  • gdb不會在父斷點處停止子進程
  • 您可以忽略子進程中的gdb信號而不影響父進程

基於此,該解決方案將產生一個子進程,該進程使用與父進程相同的客戶端ID連接到Zookeeper,並且不執行任何其他操作。 然而,Zookeeper客戶端具有會話移動的概念,客戶端通常會切換它們所連接的服務器。 如果您有兩個具有相同會話ID的客戶端,則其中一個客戶端可以移動而另一個客戶端連接到不保持其會話的服務器。 為了防止這種情況,子項必須只連接到父項當前連接的服務器。 因此父母和孩子如下所示:

Parent(zh):
  host = zookeeper_get_connected_host(zh)
  client_id = zoo_client_id(zh)
  if fork == 0
    exec child host client_id
  end

Child(host, client_id):
  ignore SIGINT
  zh = zookeeper_init(host, client_id)
  while(true)
    sleep
  end

我使用libzookeeper_mt-0.3.3測試了它,它的工作原理如上所述。 當你做這個hack時,一些骯臟的東西開始噴出Zookeeper日志,這可能令人沮喪。 如果您無法忽略日志,可以按如下方式關閉它們:

zoo_set_debug_level((ZooLogLevel)0);

在Zookeeper中禁用日志記錄是一種無證件的方式。

暫無
暫無

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

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