sf_sleep_with_sigsuspend 完整调研

黎 浩然/ 11 10 月, 2023/ 操作系统/OPERATINGSYSTEM/OS, 本科/UNDERGRADUATE/ 0 comments

首先注释newact.sa_flags = 0,并在该行(newact.sa_flags = 0)之前打印newact.sa_flags的值:

编译运行5次:

5次运行输出的newact.sa_flags(未初始化)均不相同;其中第1、2、4次发生了coredump;

猜测特定的newact.sa_flags值会导致coredump;

以第4、5次的0xdd761ff0、0x8acb1ff0为例,验证前者0xdd761ff0会coredump,后者不会;

手动赋值newact.sa_flags = 0xdd761ff0;并执行程序:

程序发生coredump;

手动赋值newact.sa_flags = 0x8acb1ff0;并执行程序:

程序不发生coredump。

初步结论:newact.sa_flags = 0的缺失使得newact.sa_flags的值是随机的;特定的newact.sa_flags会出发coredump;如0xdd761ff0会出发coredump,而0x8acb1ff0则不会。

下一步调研:针对newact.sa_flags 0xdd761ff0和newact.sa_flags 0x8acb1ff0分别调研触发coredump和不触发coredump的原因。


继续多次测试,观测运行结果:

会发生coredump的sa_flags:

0xfcad1ff0 1111 1100 1010 1101 0001 1111 1111 0000

0x67091ff0 0110 0111 0000 1001 0001 1111 1111 0000

0xdd761ff0 1101 1101 0111 0110 0001 1111 1111 0000

……

不会发生coredump的sa_flags:

0x2b001ff0 0010 1011 0000 0000 0001 1111 1111 0000

0x8acb1ff0 1000 1010 1100 1011 0001 1111 1111 0000

0x10e21ff0 0001 0000 1110 0010 0001 1111 1111 0000

查看更新版本的Linux对sa_flags的定义(Commits on Nov 4, 2021):

https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/signal-defs.h

猜想1:引发coredump的原因是SA_RESTORER(0x04000000)标志被设置

猜想2:SA_NODEFER | SA_RESTART 不会引发coredump

猜想1验证,仅仅设置SA_RESTORER,也会发生coredump:

猜想2验证:仅仅设置 SA_NODEFER | SA_RESTART 不会引发coredump

最终结论:设置SA_RESTORER会引发coredump;而SA_NODEFER | SA_RESTART 不会。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*