首页
社区
课程
招聘
android linux在子线程里面捕获不到SIGSEGV异常
2023-10-30 18:24 2260

android linux在子线程里面捕获不到SIGSEGV异常

2023-10-30 18:24
2260

在linux下 我在主线程里面用sigaction函数或者用signal函数设置好对SIGSEGV的异常处理回调函数后。。我立马*(int*)0 = 10;这样来触发一个SIGSEGV信号 。但是如果在main函数里面 就是主线程里面 可以很好的在回调函数捕获到SIGSEGV信号 。。但是如果我用pthread_create去创建一个线程 在这个线程里面设置回调。然后用*(int*)0 = 10; 来触发。。貌似程序直接退出了。命令行得到一串提示stack corruption detected (-fstack-protector)。有什么办法能让我在子线程里面捕获到自己的内存访问异常呢


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 1929
活跃值: (12845)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
珍惜Any 2 2023-10-31 09:50
2
0
sigaction在开启线程之前设置,-fstack-protector这个去掉 测一下
雪    币: 1929
活跃值: (12845)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
珍惜Any 2 2023-10-31 09:51
3
0
珍惜Any sigaction在开启线程之前设置,-fstack-protector这个去掉 测一下
如果还不行 试试pthread_sigmask函数检查一下
雪    币: 18
活跃值: (2074)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Troy 1 2023-10-31 10:48
4
0
珍惜Any 如果还不行 试试pthread_sigmask函数检查一下

我用pthread_sigmask来检测了下,好像都是正常的,应该会去捕获该信号 实际上我主线程确实可以 ,子线程就不行。我sigaction就是在main函数执行的 。然后再创建的子线程 。子线程里面我也执行了一遍sigaction来设置 。不管怎么样 子线程都捕获不到这个错误 。还有就是我本身并没有开启-fstack-protector 我在编译选项里面没找到这个标志。  总而言之 始终在创建出来的子线程里面 怎么都捕获不到。

最后于 2023-10-31 10:52 被Troy编辑 ,原因:
雪    币: 128
活跃值: (2112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
powerpcer 2023-10-31 10:57
5
0
signal handlers are process global. You cannot install per-thread signal handlers. You could try to be clever and install a signal handler that reads a function pointer with pthread_getspecific as the thread-specific handler for the signal, except that pthread_getspecific is not async-signal-safe. As far as I know, there's no async-signal-safe way to determine what thread you're in, so the only point of delivering a signal to a specific thread is generating EINTR (if SA_RESTART is omitted from sigaction flags) or stalling that thread's progress
雪    币: 18
活跃值: (2074)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Troy 1 2023-10-31 13:36
6
0
各位 我各种改测试代码 最终改得我自己也不知道为什么 突然就可以捕获到这个异常了 。main函数signal(SIGSEGV, handler1);一句这个 然后 main上面定义个函数
void handler1(int sig)
{
       printf("111111111 %d\n", sig);
       sleep(20);
}
就可以打印出这个11111111.很奇怪 如果这个函数我给它换到其他地方去 。有些异常就捕获不到。
*(int*)0 = 0;
//p[0] = '0'; 
注释这一句p是个全局int指针 初始化是0  我将这个handler1换到其他地方去 就只能捕获到注释那一句  第一句不能被捕获 。。如果放在main上面 可以捕获到第一句 但是异常code是0  算了 我不想纠结它了 。现目前确实没时间去深究。。
游客
登录 | 注册 方可回帖
返回