在一些非常小的Linux环境中,如果无法插入任何日志并且没有pstack和gdb,是否有一种获取程序挂起原因的方法?
在一些非常小的Linux环境中,如果无法插入任何日志并且没有pstack和gdb,是否有一种获取程序挂起原因的方法?
现在(2.)和(3.)非常简单。对于(3.),它是kill -USR1 1234
(对于ID为1234的进程)。对于(2.),它是:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t sigset(int sig, sighandler_t disp);
(详情请参阅man sigset
)。
至于(1.),这曾经相当困难和棘手,但现在已经基本解决:
它将尽可能获取尽可能多的堆栈跟踪信息。以下是一个简单的使用示例:
#include <iostream>
#include <boost/stacktrace.hpp>
// ... somewhere inside the `bar(int)` function that is called recursively:
std::cout << boost::stacktrace::stacktrace();
0# bar(int) at /path/to/source/file.cpp:70
1# bar(int) at /path/to/source/file.cpp:70
2# bar(int) at /path/to/source/file.cpp:70
3# bar(int) at /path/to/source/file.cpp:70
4# main at /path/to/main.cpp:93
5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
6# _start
注意: StackTrace是Boost的一个非常新的补充(截至2017年8月);如果您的Boost版本不够新,您可能需要单独获取它。