我有一个在Windows上管理gdb进程的python脚本,我需要能够将SIGINT发送到生成的进程以暂停目标进程(由gdb管理)
似乎win32中只有SIGTERM可用,但很明显,如果我从控制台和Ctrl + C运行gdb,它认为它正在接收SIGINT.有没有办法可以假装这个功能,以便在所有平台上都可以使用这些功能?
(我使用的是子进程模块,以及python 2.5/2.6)
我正在研究一个涉及链表的C项目,我需要对一段代码进行分段,以证明它不起作用.但我的代码不能崩溃.
到目前为止,这是我的处理程序:
typedef void sigfunc(int);
sigfunc *signal(int, sigfunc*);
void Handler(int sig)
{
    if (sig == SIGSEGV)
    printf("received SegFault\n");
    signal(SIGSEGV, &Handler);
}
它需要在段错误中存活下来.到目前为止,我得到的是"收到的SegFault"的无限循环.提前致谢!
我在使用gcc编写用C语言编写的信号处理程序时遇到错误,在出现Segmentation fault之后显示转储的寄存器值.当我尝试使用代码访问它时:
void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false)
{
        const char *flags_str[] = {
                "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF",
                "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID"
        };
        greg_t *regs = ctx->uc_mcontext.gregs;
        void *eip[1] = { (void*)regs[REG_EIP] };
        char **symbol = backtrace_symbols(eip, 1);
        fprintf(fd, "Registers:\neip is at ");
         backtrace_symbols_fd(eip, 1, fd->_fileno);
        size_type flags = regs[REG_EFL];
        fprintf(fd, "eflags: %x [ ", flags);
        for (size_type i = 0; i < …最近我正在研究一个用c编写的软件,它有大约3-4万行代码.当我开始出现分段错误时,我添加了一个SIGSEGV处理程序.这帮助我指出错误,因为处理程序是给一个回溯.
我的问题是除了SIGSEGV之外,当我们拥有一个大型软件时,应该处理哪些重要信号,以便错误检测很容易.
这可以任选地用于防止攻击.Ex软件在进行关键更新/操作时接收中止信号.标准告诉SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGTERM和一些其他信号具有默认属性来终止传递此信号的进程.
因此,要为我的软件添加另一层保护,我将不得不改变这些信号的行为.通过保护我的意思是我不希望我的软件在crtical更新之间终止,我将决定何时中止.
编辑:我想知道如何设计好的软件,处理SIGNAL,像安全网一样使用它们,这有助于软件的构建.
我有一个使用 sigaction 设置的信号处理程序,如下所示:
struct sigaction act, oldact;
memset(&act, 0, sizeof(struct sigaction));
act.sa_handler = sig_handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);
sigaddset(&act.sa_mask, SIGINT);
sigaddset(&act.sa_mask, SIGTERM);
sigaddset(&act.sa_mask, SIGTSTP);
sigaction(SIGALRM, &act, &oldact);
sigaction(SIGINT, &act, &oldact);
sigaction(SIGTERM, &act, &oldact);
sigaction(SIGTSTP, &act, &oldact);
act.sa_flags = 0;
在此之后,我运行一个 for 循环来收集输入并将其打印出来(基本上就像 cat 一样)。
char *linebuf = NULL;
size_t n = 0;
int len;
while(1){
    len = getline(&linebuf, &n, stdin);
    if(len>0){
        printf("%s", linebuf);
    }
}
但是,一旦我从处理的信号,返回getline()输入不再阻止,而是始终如一的回报-1,同时设置errno到EINTR这是一个中断的系统调用。我显然打算中断getline(),但如何重置它以便我可以继续读取输入?
有一些类似的问题并没有真正解决我的问题,但它可能会帮助您更好地理解问题。1 2
另一个有趣的花絮是我在signal() …
我的程序需要对vector<string>信号处理程序中的a 的内容执行只读访问SIGINT.(另一种方法是使用固定大小的固定长度C字符串数组.)该程序设计为在POSIX环境中运行.
是vector::operator[]和vector::size()异步安全(或信号安全)?
问题在于以编程方式在优化的二进制文件中打印有意义的stacktrace。例如,我们可以使用backtrace,backtrace_symbols,abi :: __ cxa_demangle打印堆栈跟踪。但据我所知,我们需要使用编译器标志-g而不是-O1优化标志来构建二进制文件。我可以做到的。
我期待在发行二进制文件(例如,用-03标志编译)中生成具有正确函数名称的回溯。
可行吗?我对此进行了大量研究,但没有任何实质性意义。
更新1:有没有一种方法可以让我们创建一个包含一些符号的辅助文件,并且可以在优化的二进制过程中引用该文件来生成堆栈跟踪?
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
void sighup()
{
    signal(SIGHUP,sighup);
    printf("Received SIGHUP! Happy Now ??\n");
}
void sigbus()
{
    signal(SIGBUS,sigbus);
    printf("received SIGBUS! Get a life dude !\n");
}
void sigquit()
{
    printf("I am done with you. Bye!!\n");
    fflush(stdout);
    exit(0);
}
int main()
{   
    int pid = fork();
    if (pid < 0)
    {
        perror("fork");
        exit(1);
    }
    if (pid == 0)
    {   
        printf("child\n");
        signal(SIGHUP,sighup);
        signal(SIGBUS,sigbus);
        signal(SIGQUIT,sigquit);
        while(1)
        {
            ;
        }
    }
    else
    {
        printf("parent\n");
        kill(pid, SIGHUP);
        kill(pid, SIGBUS);
        kill(pid, SIGQUIT);
        wait();
    }
} …我知道这是不是安全的malloc或者free被调用,直接或间接地从信号处理程序.
但是,如果我能保证至少有一个共享引用仍然存在,那么复制构造和销毁其他共享或弱引用是否安全,或者我是否必须自行引用引用计数?
(是的,我知道信号处理人员通常不应该做太多.但这次我有充分的理由.)
我试图找到与处理异步信号相比处理同步信号(SIGSEGV、SIGILL 等)的资源。
典型的信号处理机制(例如使用 kill)在从内核到用户模式的控制转移时调用信号处理程序。我的理解是,“同步”信号更像是一个系统调用,因为控制立即转移到内核 - 可能是因为同步信号通常与 CPU 中断(内存保护等)相关联,并且无论如何都会调用内核处理程序。
在同步信号处理程序中使用其他“异步信号不安全”的 libc 函数是否安全?例如,我看到 Linux mprotect(2) 手册页在 SIGSEGV 处理程序中使用了 printf。如何确定在这些情况下是否可以使用函数?
典型的类 Unix 内核对同步信号的处理与其对异步信号的处理有何不同?是什么让它们“同步”?
signal-handling ×10
c ×7
c++ ×3
signals ×3
async-safe ×1
backtrace ×1
c++11 ×1
debugging ×1
fork ×1
gcc ×1
getline ×1
linux ×1
linux-kernel ×1
posix ×1
python ×1
sigint ×1
stack-trace ×1
subprocess ×1
unix ×1
vector ×1
windows ×1