[英]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.