Có cách nào để tìm ra nguồn gốc của tín hiệu được gửi trong Red Hat Enterprise Linux 5 (SIGTERM, v.v.) không? Tôi thường xuyên đặt bẫy HẠN trong một ứng dụng và tôi không biết nó đến từ đâu.
Có cách nào để tìm ra nguồn gốc của tín hiệu được gửi trong Red Hat Enterprise Linux 5 (SIGTERM, v.v.) không? Tôi thường xuyên đặt bẫy HẠN trong một ứng dụng và tôi không biết nó đến từ đâu.
Câu trả lời:
Trang hướng dẫn cho sigaction(2)
thấy rằng PID của người gửi tín hiệu có sẵn trong cấu trúc siginfo_t được chuyển đến bộ xử lý tín hiệu của bạn. Điều này rõ ràng yêu cầu bạn sử dụng sigaction ().
Từ trang người đàn ông:
Cấu trúc sigaction được định nghĩa là một cái gì đó như:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
Và siginfo_t
cấu trúc trông như thế này:
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
int si_band; /* Band event */
int si_fd; /* File descriptor */
}
Trên các nền tảng có DTrace (OS X, Solaris, những người khác?) Bạn có thể sử dụng nó với một đầu dò như thế này để ghi lại thông tin bạn đang theo dõi:
sudo dtrace -n 'proc:::signal-send { printf("Process %d (%s by UID %d) sending signal %d to pid=%d\n",pid,execname,uid,args[2],args[1]->pr_pid); }'
Tôi dựa trên tập lệnh được tìm thấy ở dưới cùng của http://www.oustndangregg.com/DTrace/dtrace_oneliners.txt cùng với một số mẹo "tên biến có liên quan" bổ sung tại /programming//a/10465606/179583 , và dường như làm việc theo một số thử nghiệm cơ bản. Bây giờ, nếu chỉ có quá trình của tôi sẽ bất ngờ chết một lần nữa! ;-)
strace
các mục đích tương tự nếu tôi không nhầm. Tôi đã có thể theo dõi các tín hiệu nhận được bởi một quá trình bằng cách theo dõi bài viết này .