问题标签 [signal-handling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何编写信号处理程序来捕获 SIGSEGV?
我想编写一个信号处理程序来捕获 SIGSEGV。我保护一块内存以供读取或写入使用
这可以保护从缓冲区开始的页面大小字节的内存免受任何读取或写入。
其次,我尝试读取内存:
这将生成一个 SIGSEGV,并且我的处理程序将被调用。到现在为止还挺好。我的问题是,一旦调用了处理程序,我想通过执行更改内存的访问写入
并继续我的代码的正常运行。我不想退出该功能。在将来写入同一内存时,我想再次捕获信号并修改写权限,然后记录该事件。
这是代码:
问题是只有信号处理程序运行,捕获信号后我无法返回主函数。
django - 信号处理程序应该放在 django 项目中的什么位置?
我刚刚开始在 django 项目中实现信号侦听器。虽然我了解它们是什么以及如何使用它们。我很难弄清楚我应该把它们放在哪里。来自 django 网站的文档是这样说的:
您可以将信号处理和注册代码放在您喜欢的任何地方。但是,您需要确保尽早导入它所在的模块,以便在需要发送任何信号之前注册信号处理。这使您的应用程序的 models.py 成为注册信号处理程序的好地方。
虽然这是一个很好的建议,但在我的 models.py 中包含非模型类或方法只会让我犯错。
那么,存储和注册信号处理程序的最佳实践/规则是什么?
iphone - iphone - 如何正确处理异常情况(信号?)
在我的 iphone 应用程序中,我想提供某种应用程序终止处理程序,它将在应用程序终止之前完成一些最终工作(删除一些敏感数据)。
我想处理尽可能多的终止情况:
1)用户终止应用程序
2)设备电量耗尽
3)系统由于某种原因(例如内存不足或应用程序冻结)终止应用程序
4)应用程序崩溃(EXC_BAD_ACCESS 或 SIGSEGV)
还有什么特殊情况吗?
实现这一目标的最佳方法是什么(例如,在情况 2 中调用了 applicationWillTerminate 方法)?
是否可以在信号处理程序中进行清理(包括 iPhone 安全框架调用)?
问候
linux - 如何在信号处理程序中更改 FPU 上下文 (C++/Linux)
我编写了一个信号处理程序来捕获 FPE 错误。即使发生这种情况,我也需要继续执行。我收到一个 ucontext_t 作为参数,我可以将错误的操作数从 0 更改为另一个值,但 FPU 上下文仍然很糟糕,我遇到了无限循环?
有人已经在 Linux 上操纵 ucontext_t 结构了吗?
我终于找到了一种通过清除 ucontext_t 的状态标志来处理这些情况的方法,如下所示:
取反 0x3F 将 0 放入 FPU (x87) 的状态寄存器的 6 位。这样做意味着在计算后检查 FPE 异常。
asynchronous - 如何正确编写调用 AsyncGetCallTrace 的 SIGPROF 处理程序?
我正在编写一个简短的分析器(用 C 语言),它旨在定期打印出各种 Java 客户端中线程的堆栈跟踪。我必须使用未记录的函数AsyncGetCallTrace
而不是GetStackTrace
最小化入侵并允许堆栈跟踪而不管线程状态如何。该函数的源代码可以在这里找到:http: //download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz
in hotspot/src/share/vm/prims/forte.cpp
。我发现了一些记录 JVMTI、信号处理和计时的手册页,以及一个详细介绍如何设置AsyncGetCallTrace
调用的博客:http: //jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi-sigprof -and.html
该博客缺少的是在信号处理程序中实际调用函数的代码(作者假设读者可以自己完成此操作)。我正在寻求帮助来做到这一点。我不确定如何以及在哪里创建struct ASGCT_CallTrace
(和内部struct ASGCT_CallFrame
),如上述文件中定义的那样forte.cpp
。struct ASGCT_CallTrace
是传递给 的参数之一,AsyncGetCallTrace
因此我确实需要创建它,但我不知道如何为其字段获取正确的值:JNIEnv *env_id
、jint num_frames
和JVMPI_CallFrame *frames
。此外,我不知道传递给的第三个参数AsyncGetCallTrace (void* ucontext)
应该是什么?
上述问题是我遇到的主要问题。但是,我面临的其他问题包括:
SIGPROF
计时器似乎并没有以指定的时间间隔准确地引发,而是不那么频繁。也就是说,如果我将计时器设置为每秒发送SIGPROF
一次(1 秒,0 微秒),那么在 5 秒的运行中,我得到的处理程序输出少于 5 个SIGPROF
(通常为 1-3 个)SIGPROF
Thread.sleep
在 Java 代码中,处理程序输出根本不会出现。因此,如果SIGPROF
要每秒发送 a ,并且我有Thread.sleep(5000);
,则在执行该代码期间将不会获得任何处理程序输出。
任何帮助,将不胜感激。其他详细信息(以及部分代码和示例输出)将根据要求发布。
linux - 我可以写保护 Linux 进程地址空间中的每个页面吗?
我想知道是否有一种方法可以写保护 Linux 进程地址空间中的每个页面(从进程本身内部,通过
mprotect()
)。“每一页”是指进程地址空间的每一页,它们可能被在用户模式下运行的普通程序写入——所以,程序文本、常量、全局变量和堆——但我只对常量、全局变量和堆感到满意。我不想写保护堆栈——这似乎是个坏主意。
一个问题是我不知道从哪里开始写保护内存。查看/proc/pid/maps
,它显示了给定 pid 正在使用的内存部分,它们似乎总是以 address 开头
0x08048000
,以程序文本开头。(在 Linux 中,据我所知,进程的内存布局是底部的程序文本,然后是上面的常量,然后是全局变量,然后是堆,然后是大小不同的空空间,具体取决于大小堆或堆栈,然后堆栈从虚拟地址的内存顶部向下增长0xffffffff
。)有一种方法可以判断堆的顶部在哪里(通过调用sbrk(0)
,它只是返回一个指向当前“中断”的指针,即,堆的顶部),但并不是真正判断堆从哪里开始的方法。
如果我试图保护所有页面0x08048000
不被中断,我最终会得到一个mprotect: Cannot allocate memory
错误。我不知道为什么mprotect
要分配内存——谷歌也不是很有帮助。有任何想法吗?
顺便说一句,我想这样做的原因是因为我想创建一个在程序运行期间写入的所有页面的列表,我能想到的方法是写保护所有页面,让任何尝试的写入导致写入错误,然后实现一个写入错误处理程序,将页面添加到列表中,然后删除写保护。我想我知道如何实现处理程序,只要我能弄清楚要保护哪些页面以及如何去做。
谢谢!
perl - 在不将 $SIG{CHLD} 设置为 IGNORE 或自定义信号处理程序的情况下获取子节点
我正在尝试编写一个为每个连接分叉的套接字服务器。除了一个小警告外,我已经成功了:我的子进程使用 Net:OpenSSH->capture2() ,它要求 $SIG{CHLD} 不设置为 IGNORE 或自定义信号处理程序。如何在不设置信号处理程序或使用 wait 或 waitpid 减慢父进程速度的情况下收割我的孩子?
这是我的服务器代码:
如果我使用如上所示的代码,一切正常,但我最终会得到一堆僵尸进程。如果我添加
僵尸被收割了,但是 Net::OpenSSH->capture2() 方法调用有一个混乱的返回码。我假设我的信号处理程序正在干扰 Net::OpenSSH 需要正常工作的一些自定义处理程序?
linux - Linux C and C++: what else should I be logging when handling signals like SIGSEGV?
Working on some linux (Ubuntu) systems, running some in-house C and C++ apps (gcc).
There is a long list of signals which are handled, such as SIGSEGV
and SIGINT
. On signal, the callstack is obtained using backtrace(3)
and backgrace_symbols(3)
. For C++ the function names are even demangled with abi::__cxa_demangle()
.
My question is: when these signals come up, what other C/C++ API is there which would give us more useful information to log for debugging after-the-fact? Or is the backtrace the only 'sexy' thing to do?
c - 键盘信号处理,向回调处理函数添加参数(Ubuntu,intel)
我有这个代码:
有没有办法在回调函数中传递一个额外的参数?就像是:
谢谢
python - 你能解释一下python中的以下信号处理行为吗?
我有以下程序:
有一个客户端程序连接到此但不发送任何数据。问题是当发送 SIGHUP 时,会抛出“中断的系统调用”异常。知道为什么吗?它发生在 python 2.6+ 和 FreeBSD 上。我怀疑它与http://bugs.python.org/issue1975有关。