博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xcode里调试 自定义 signal的信号 回调函数的执行
阅读量:2347 次
发布时间:2019-05-10

本文共 1485 字,大约阅读时间需要 4 分钟。

 signal信号:

 signal是一种软中断信号,提供异步事件处理机制。

signal是进程间相互传递信息的一种粗糙方法,使用场景: 进程终止相关;

终端交互;  

编程错误或硬件错误相关,系统遇到不可恢复的错误时触发崩溃机制让程序退出,比如:除0、内存写入错误等。

        这里我们主要考虑系统遇到不可恢复的错误时即Crash时,信号相关的应用。signal信号处理是UNIX操作系统机制,可以基于signal来捕获Android Native Crash。

 signal注册和处理signal():

       注册signal handler;  

      调用成功时,会移除signo信号当前的操作,以handler指定的新信号处理程序替代;  

     信号处理函数返回void,因为没有地方给该函数返回。注册自定义信号处理函数,构造Crash后,发出信号并执行自定义信号处理逻辑。

 Xcode Debug运行时,添加断点,在Crash触发前,执行pro hand -p true -s false SIGABRT命令。

 

1、

 #define CALLSTACK_SIG SIGUSR1

 signal(CALLSTACK_SIG, thread_singal_handler);

 

2、

static void thread_singal_handler(int sig)

{
    NSLog(@"main thread catch signal: %d", sig);
    
    if (sig != CALLSTACK_SIG) {
        return;
    }
    
    NSArray* callStack = [NSThread callStackSymbols];
    
    id<PMainThreadWatcherDelegate> del = [PMainThreadWatcher sharedInstance].watchDelegate;
    if (del != nil && [del respondsToSelector:@selector(onMainThreadSlowStackDetected:)]) {
        [del onMainThreadSlowStackDetected:callStack];
    }
    else
    {
        NSLog(@"detect slow call stack on main thread! \n");
        for (NSString* call in callStack) {
            NSLog(@"%@\n", call);
        }
    }
    
    return;
}

问题:Xcode Debug 调试时  thread_singal_handler,不被执行。

解决:参考《Xcode里调试signal的信号回调处理函数》的设置 :

   pro hand -p true -s false SIGUSR1

就可以 执行 相应的回调函数 thread_singal_handler 了。

 

 

参考:iOS Mach异常和signal信号 

以下是《Xcode里调试signal的信号回调处理函数》中内容 ()

 

我们在我的代码里添加了异常捕获功能,包括对signal的捕获

但是在Xcode里调试的时候,程序不会进入bugrpt_signalHandler处理函数里面,为什么呢?

因为Xcode屏蔽了signal的回调,我们需要在lldb中输入以下命令,signal的回调就可以进来了

 

pro hand -p true -s false SIGABRT

注意:SIGABRT可以替换为你需要的任何signal类型,比如SIGSEGV

你可能感兴趣的文章
可能返回 null 的 SQL 语句
查看>>
以下关于STL的描述中,错误的有
查看>>
假设某棵二叉查找树的所有键均为1到10的整数,现在我们要查找5。下面____不可能是键的检查序列。
查看>>
给定一个整数sum,从有N个无序元素的数组中寻找元素a、b、c、d,使得 a+b+c+d =sum,最快的平均时间复杂度是____。
查看>>
设二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序____。
查看>>
将整数序列(7-2-4-6-3-1-5)按所示顺序构建一棵二叉排序树a(亦称二叉搜索树),之后将整数8按照二叉排序树规则插入树a中,请问插入之后的树a中序遍历结果是____。
查看>>
IP地址、子网掩码、网络号、主机号、网络地址、主机地址
查看>>
已知int a[]={1,2,3,4,5};int*p[]={a,a+1,a+2,a+3};int **q=p;表达式*(p[0]+1)+**(q+2)的值是____。
查看>>
CPU输出数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用()
查看>>
整型字符常量和字符字面量的区别 sizeof(char) 和 sizeof('a')
查看>>
表的主键特点中,说法不正确的是()
查看>>
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
查看>>
冯诺依曼工作方式的基本特点是____
查看>>
下列关于文件索引结构的叙述中,哪些是正确的?
查看>>
Java异常处理
查看>>
JQueryUI实现对话框
查看>>
Java流(Stream)/文件(File)/IO
查看>>
文件处理(压缩与解压)
查看>>
Java中的目录
查看>>
JQuery实现对select选择框的赋值
查看>>