首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 平台 Native 代码崩溃捕获机制及实现

(3) 信号处理 信号处理函数是运行在用户态,调用处理函数前,内核会将当前内核栈内容备份拷贝到用户栈,并且修改指令寄存器(eip)将其指向信号处理函数。...但即使我们自己在信号处理程序中不使用不可重入函数,也无法保证保存信号处理程序中不会有非异步信号安全函数。所以要使用alarm保证信号处理程序不会陷入死锁或者死循环状态。...考虑到信号处理程序诸多限制,一般会clone一个新进程,在其中完成解析堆栈等任务。...下面是Google Breakpad流程图,在新进程中DoDump,使用ptrace解析crash进程堆栈,同时信号处理程序等待子进程完成任务后,再调用旧信号处理函数。父子进程使用管道通信。...程序要想运行,首先要由操作系统负责为其创建进程,并在进程虚拟地址空间中为其代码段和数据段建立映射。光有代码段和数据段是不够,进程在运行过程中还要有其动态环境,其中最重要就是堆栈

5.1K116

iOS_Crash 四:捕获和防护

1.Crash 捕获 根据 Crash 不同来源,分为以下三类: 1.2.NSException 应用层异常,未被捕获异常,导致程序向自身发送了 SIGABRT 信号而崩溃,是应用程序自己可控...C++异常 系统捕获到 C++ 异常后会将其转换为 OC 异常抛出,此时调用堆栈是在异常发生时队长;但若转换失败则会调用 __cxa_throw 抛出异常,此时调用队长是处理异常堆栈,导致原始异常调用堆栈丢失...SIGBUS:非法地址 SIGFPE:致命算术运算错误 SIGKILL:立即结束程序运行。不能被阻塞、处理和忽略。...stack_t ss; struct sigaction sa; struct timespec req, rem; long ret; // 申请一块内存空间作为可选信号处理函数栈使用...函数通知系统可选信号处理栈帧存在及其位置 sigaltstack(&ss, NULL); // 指定 SA_ONSTACK 标志通知系统这个信号处理函数应该在可选栈帧上面执行注册信号处理函数

36050
您找到你想要的搜索结果了吗?
是的
没有找到

sigaction 使用

sa_flag sa_flag 指定一系列用于修改信号处理过程行为标志,由下面的0个或多个标志通过or运算组合而成: SA_SIGINFO 指定信号处理函数需要三个参数,所以应使用sa_sigaction...SA_NODEFER 在信号处理函数处置信号时段中,核心程序不会把这个间隙中产生信号阻塞。...(重启被中断系统调用) SA_RESETHAND 信号处理函数接收到信号后,会先将对信号处理方式设为预设方式,而且当函数处理信号时,后来发生信号将不会被阻塞。...SA_ONSTACK 如果利用sigaltstack()建立信号专用堆栈,则此标志会把所有信号送往该堆栈。...使用实例 redis 信号处理 redis 信号处理 参考 ref 1 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141131.html原文链接:https

38820

Android Native Crash 收集

所以我们需要设置一个用于紧急处理新栈,可以使用sigaltstack()在任意线程注册一个可选栈,保留一下在紧急情况下使用空间。...(系统会在危险情况下把栈指针指向这个地方,使得可以在一个新运行信号处理函数) void signal_handle(int sig) { write(2, "stack overflow\...#endif } pc值转内存地址 pc值是程序加载到内存中绝对地址,绝对地址不能直接使用,因为每次程序运行创建内存肯定都不是固定区域内存,所以绝对地址肯定每次运行都不一致。...第四种:使用 Google breakpad,这是所有 C/C++堆栈获取权威方案,基本业界都是基于这个库来做。...;如果当前函数发生了无限递归造成堆栈溢出,在统计时候需要考虑到这种情况而新开堆栈否则本来就满了堆栈又在当前堆栈处理溢出信号处理肯定是会失败;再比方说多进程多线程在 C 各种问题,真的是很复杂

2.2K10

linux系统编程之基础必备(六):可重入函数、线程安全、volatile

假设该函 数在某次执行过程中,在已经获得资源锁之后,有异步信号发生,程序执行流转交给对应信号处理函数;再假设在该信号处理函数中也需要调用函 数 func(),那么func()在这次执行中仍会在访问共享资源前试图获得资源锁...,然而我们知道前一个func()实例已然获得该锁,因此信号处理函数阻塞; 另一方面,信号处理函数结束前被信号中断线程是无法恢复执行,当然也没有释放资源机会,这样就出现了线程和信号处理函数之间死锁局...二、可重入函数 我们知道,当捕捉到信号时,不论进程主控制流程当前执行到哪儿,都会先跳到信号处理函数中执行,从信号处理函数返回后再继续执行主控制流程 。...信号处理函数是一个单独控制流程,因为它和主控制流程是异步,二者不存在调用和被调用关系,并且使用不同堆栈空间。...,要么都执行,要么都不执行,不会执行到中间被打断,也不 会在其处理并行做这个操作。

1.3K20

入侵检测之syscall监控

常见情况是脚本允许正常终止和处理常见键盘中断(例如ctrl + c和ctrl + d),实际系统发送了SIGINT信号给脚本进程,SIGINT信号默认处理方式就是退出程序。...如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT处理方式了,trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN...攻击者可以使用可加载内核模块秘密地保留在系统并逃避防御。...常见情况是脚本允许正常终止和处理常见键盘中断(例如ctrl + c和ctrl + d),实际系统发送了SIGINT信号给脚本进程,SIGINT信号默认处理方式就是退出程序。...如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT处理方式了,trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN

2.4K10

如何解决Xcode中SIGABRT错误

这是由iOS(操作系统)发送到正在运行应用信号,由于运行时错误,该信号将立即退出该应用。...在这种情况下,您将获得一个堆栈跟踪和有关不符合“键值编码兼容”神秘错误消息。 SIGABRT错误问题在于它过于笼统。Xcode基本是在说:“看,您应用程序崩溃了,这就是我们所知道。”...这并不意味着导致错误代码行在stacktrace中任何位置。有时是这样,但是在其他情况下,stacktrace只会导致代码阻塞在您自己代码中其他位置设置。 不要盲目地盯着SIGABRT错误。...Interface Builder中UI元素之间建立连接 有一次您更改了初始插座属性名称,并且您应用因SIGABRT错误而开始崩溃 当您使用Interface Builder创建视图控制器时,您应用程序运行时...此时,它将还将XIB插座连接到视图控制器类属性。 如果您更改了插座属性名称,则您应用程序将找不到它。因此,它将引发异常。导致SIGABRT错误原因是未处理该异常。

5.7K20

goroutine背后系统知识

可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言运行库,对于C语言,Linux是glibc...更严格说,其实还是用了TSS,因为只有通过TSS才能把堆栈切换到内核堆栈指针SS0:ESP0,但除此之外TSS功能就完全没有被使用了。...(虽然我们可以通过注册信号处理函数来模拟内核里时钟中断并取得控制权,可问题在于,信号处理函数是由内核调用在其结束时候,内核重新获得控制权,随后返回用户态并继续沿着信号发生时被中断代码路径执行,...从而我们无法在信号处理函数内进行任务切换) (2) 堆栈。...任务堆栈空间可以是在当前线程堆栈分配,也可以是在堆上分配,但通常是在堆上分配比较好:几乎没有大小或任务总数限制、堆栈大小可以动态扩展(gcc有split stack,但太复杂了)、便于把任务切换到其他线程

84940

Goroutine背后系统知识

可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言运行库,对于C语言,Linux是glibc...更严格说,其实还是用了TSS,因为只有通过TSS才能把堆栈切换到内核堆栈指针SS0:ESP0,但除此之外TSS功能就完全没有被使用了。...(虽然我们可以通过注册信号处理函数来模拟内核里时钟中断并取得控制权,可问题在于,信号处理函数是由内核调用在其结束时候,内核重新获得控制权,随后返回用户态并继续沿着信号发生时被中断代码路径执行,...从而我们无法在信号处理函数内进行任务切换) (2) 堆栈。...任务堆栈空间可以是在当前线程堆栈分配,也可以是在堆上分配,但通常是在堆上分配比较好:几乎没有大小或任务总数限制、堆栈大小可以动态扩展(gcc有split stack,但太复杂了)、便于把任务切换到其他线程

69760

goroutine背后系统知识

可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言运行库,对于C语言,Linux是glibc...更严格说,其实还是用了TSS,因为只有通过TSS才能把堆栈切换到内核堆栈指针SS0:ESP0,但除此之外TSS功能就完全没有被使用了。...(虽然我们可以通过注册信号处理函数来模拟内核里时钟中断并取得控制权,可问题在于,信号处理函数是由内核调用在其结束时候,内核重新获得控制权,随后返回用户态并继续沿着信号发生时被中断代码路径执行,...从而我们无法在信号处理函数内进行任务切换) (2) 堆栈。...任务堆栈空间可以是在当前线程堆栈分配,也可以是在堆上分配,但通常是在堆上分配比较好:几乎没有大小或任务总数限制、堆栈大小可以动态扩展(gcc有split stack,但太复杂了)、便于把任务切换到其他线程

69350

goroutine背后系统知识

可是,我们写程序也很少直接调用NTDLL或者VDSO,而是通过更上一层封装,这一层处理了参数准备和返回值格式转换、以及出错处理和错误代码转换,这就是我们所使用语言运行库,对于C语言,Linux是glibc...更严格说,其实还是用了TSS,因为只有通过TSS才能把堆栈切换到内核堆栈指针SS0:ESP0,但除此之外TSS功能就完全没有被使用了。...(虽然我们可以通过注册信号处理函数来模拟内核里时钟中断并取得控制权,可问题在于,信号处理函数是由内核调用在其结束时候,内核重新获得控制权,随后返回用户态并继续沿着信号发生时被中断代码路径执行,...从而我们无法在信号处理函数内进行任务切换) (2) 堆栈。...任务堆栈空间可以是在当前线程堆栈分配,也可以是在堆上分配,但通常是在堆上分配比较好:几乎没有大小或任务总数限制、堆栈大小可以动态扩展(gcc有split stack,但太复杂了)、便于把任务切换到其他线程

64380

QThread类

---- [static] int QThread::idealThreadCount()   返回可在系统运行理想线程数。这样就可以查询系统中实际和逻辑处理器内核数量。...如果您需要等待给定条件进行更改,请避免使用此功能。 相反,你应该将一个槽连接到指示更改信号使用事件处理程序(请参阅QObject::event())。 注意:此功能不保证准确性。...该请求是建议性,由线程运行代码来决定它是否以及如何根据此类请求执行操作。此函数不会停止在线程运行任何事件循环,也不会以任何方式终止它。...如果您需要等待给定条件进行更改,请避免使用此功能。 相反,你应该将一个槽连接到指示更改信号使用事件处理程序(请参阅QObject::event())。 注意:此功能不保证准确性。...如果您需要等待给定条件进行更改,请避免使用此功能。 相反,你应该将一个槽连接到指示更改信号使用事件处理程序(请参阅QObject::event())。 注意:此功能不保证准确性。

1.1K20

QThread类

---- [static] int QThread::idealThreadCount()   返回可在系统运行理想线程数。这样就可以查询系统中实际和逻辑处理器内核数量。...如果您需要等待给定条件进行更改,请避免使用此功能。 相反,你应该将一个槽连接到指示更改信号使用事件处理程序(请参阅QObject::event())。 注意:此功能不保证准确性。...该请求是建议性,由线程运行代码来决定它是否以及如何根据此类请求执行操作。此函数不会停止在线程运行任何事件循环,也不会以任何方式终止它。...如果您需要等待给定条件进行更改,请避免使用此功能。 相反,你应该将一个槽连接到指示更改信号使用事件处理程序(请参阅QObject::event())。 注意:此功能不保证准确性。...如果您需要等待给定条件进行更改,请避免使用此功能。 相反,你应该将一个槽连接到指示更改信号使用事件处理程序(请参阅QObject::event())。 注意:此功能不保证准确性。

2.6K20

Linux下内存检测工具asan使用介绍

1、编译选项 1.1 Gcc编译选项 -fsanitize=address:开启内存越界检测 -fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行...,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;若未设置此选项,则内存出错即报错退出, ASAN_CFLAGS += -fsanitize...2、ASAN运行选项 2.1 ASAN_OPTIONS设置 ASAN_OPTIONS是Address-Sanitizier运行选项环境变量。...handle_segv=1:处理段错误;也可以添加handle_sigill=1处理SIGILL信号 quarantine_size=4194304:内存cache可缓存free内存大小4M ASAN_OPTIONS...其次,平台软件通常都会内部实现一套内存操作接口,为使用asan工具,需要替换成glibc提供接口。此时,可以通过LD_PRELOAD环境变量解决这类问题。

6.6K20

说说eBPF超能力

动态改变内核行为 eBPF 允许我们在内核中运行自定义程序。这是我们改变内核行为方式。这是一个真正游戏规则改变者。过去,如果要更改 Linux 内核,需要很长时间。它需要内核编程方面的专业知识。...我们甚至不必停止并重新启动正在运行应用程序,这些更改会立即影响内核。 动态漏洞修补 我们可以将其用于多种不同目的,其中之一是动态修补漏洞。我们可以使用 eBPF 让自己对漏洞利用更具弹性。...在这种情况下,内核网络堆栈甚至永远不会看到该数据包。它处理速度非常快。 如果网卡不支持它,内核可以再次运行 eBPF 程序,在收到该网络数据包后尽可能早地运行。...它聚合来自集群中每个节点运行 eBPF 程序信息,以生成整个集群如何使用 CPU 时间概览,并详细介绍这些应用程序正在调用特定函数。...真正有趣是,您无需对应用程序进行任何更改,甚至无需更改配置即可获得此工具。因为正如我们所看到,当您对内核进行更改时,它会立即影响在该内核运行任何内容。我们不必重新启动这些进程或任何东西。

55441

linux系统编程之信号(四):信号捕捉与sigaction函数

一、内核如何实现信号捕捉 如果信号处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数代码是在用户空间处理过程比较复杂,举例如下: 1....用户程序注册了SIGQUIT信号处理函数sighandler。 2. 当前正在执行main函数,这时发生中断或异常切换到内核态。 3....内核决定返回用户态后不是恢复main函数上下文继续执行,而是执行sighandler函数,sighandler和main函数使用不同堆栈空间,它们之间不存在调用和被调用关系,是两个独立控制流程。.../sa_mask  ^Crev sig=2 ^\ 5s过后接着才输出Quit (core dumped),即在信号处理函数执行期间sa_mask集合中信号被阻塞直到运行完毕。...在多线程环境下,编写信号处理函数需要安全地处理,可以参考这篇文章: tgkill()发给指定进程中指定线程; pthread_kill()由一个线程发给同进程中另一个线程,实际是通过封装tgkill

2.9K00

Java面试集锦(一)之操作系统

共享内存是最快IPC方式,它是针对其他进程间通信方式运行效率低而专门设计。它往往与其他通信机制,如信号量配合使用,来实现进程间同步和通信。 7....程序中断通常简称中断,是指CPU在正常运行程序过程中,由于预先安排或发生了各种随机内部或外部事件,使CPU中断正在运行程序,而转到为响应服务程序处理。   ...11.OS如何实现内存管理? 虚拟内存 内存页 1. 并发 并发是指宏观在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。...多个进程能在同一个处理并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。 虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自地址空间。...主要包括缓冲管理、设备分配、设备处理、虛拟设备等。 静态链接库和动态链接库区别 静态连接库就是把(lib)文件中用到函数代码直接链接进目标程序程序运行时候不再需要其它库文件。

37730

Python中threading模块

要管理线程本地数据,只需创建一个local(或子类)实例并在其存储属性:mydata = threading.local()mydata.x = 1对于单独线程,实例值将不同。...如果不支持更改线程堆栈大小,ThreadError则引发a。如果指定堆栈大小无效,则aValueError被提升,堆栈大小未经修改。...当底层锁是a时RLock,它不会使用其release()方法释放,因为当递归多次获取锁时,这实际可能无法解锁。相反,使用了RLock类内部接口,即使多次递归获取它也能真正解锁它。...()有界信号使用减少了导致信号量被释放编程错误超过其获取编程错误可能性。...在2.7版中更改:以前,该方法始终返回None。定时器对象此类表示应该在经过一定时间后运行操作 - 计时器。 Timer是一个子类,Thread 因此也可以作为创建自定义线程示例。

2K20

Java HotSpot 执行引擎架构

这不仅简化了VM内部对象模型,而且还允许通过与其他Java编程语言对象相同垃圾收集器收集类。 本地线程支持,包括抢占和多处理 每线程方法激活堆栈使用主机操作系统堆栈和线程模型进行表示。...由于执行动态加载类强大功能,基于Java技术程序可以随时更改。这使得执行许多类型全局优化变得更加困难。...随着程序运行,该热点监控继续动态进行, 这种方法一个微妙但重要好处是,通过延迟编译直到代码已经执行了一段时间(在机器时间测量,而不是用户时间)之后,可以在代码使用方式收集信息,然后利用执行更智能优化...这是因为用Java语言编写程序不仅能够即时更改方法调用模式,还可以将新Java代码动态加载到正在运行程序中。 内联是基于一种全球分析形式。...在1.4版本之前,Java HotSpot VM不允许应用程序安装信号处理程序处理某些信号,例如SIGBUS,SIGSEGV或SIGILL,因为这些信号处理程序可能会与Java HotSpot VM内部使用信号处理程序冲突

1K31
领券