簡體   English   中英

在 Linux 上調試信號處理程序

[英]Debugging signal handlers on Linux

我已經為 SIGCHLD 設置了一個信號處理程序。 出於好奇,我想嘗試從 gdb 中調試信號處理程序。 有什么辦法可以做到嗎?

我嘗試在處理程序上設置斷點並從 gdb 中運行二進制文件; 但是我似乎無法通過指令調試處理程序指令。 有什么辦法可以去做嗎? 我嘗試設置硬件斷點,但這也無濟於事。 我正在使用的代碼如下所示。

我正在 64 位 Ubuntu 機器上嘗試這個。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int VAL = 0;
void handler(int sig) {
  VAL=1;
}

int main(int argc, const char *argv[]) {
  int pid, status;
  signal(SIGCHLD, handler);

  pid = fork();
  if ( pid == 0 ) exit(0);

  wait(&status);
  printf("Returned from handler %d\n", VAL);
  return 0;
}

打印的輸出是“Returned from handler 1”,表明 SIGCHLD 是由進程而不是 gdb 處理的; 來自 gdb 內的info signal也暗示了同樣的情況。

可以使用 GDB 的 handle 命令。 handle 命令將一系列信號(待處理)后跟動作作為參數。 你也可以使用以下 gdb 選項 nostop & pass(讓程序看到這個信號)。
http://sunsite.ualberta.ca/Documentation/Gnu/gdb-5.0/html_node/gdb_38.html

您幾乎可以肯定是在打開優化的情況下進行編譯。 這與非易失性VAL相結合,允許您的編譯器執行看似激進的優化。

關閉優化( -O0用於 GCC)或將VAL限定為volatile以獲得所需的效果。

如果您可以使用線程,那么有一種方法。 創建一個線程並在條件變量上阻止它。 在信號處理程序中,只需向條件變量發出信號,線程將在您設置中斷的行處中斷。 不幸的是,直接在信號上我不確定會發生什么,根據我的經驗,有些信號是 gdb 的問題。

暫無
暫無

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

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