我正在尝试让多线程程序在valgrind下工作。它使用sigaltstack()
函数来为信号处理程序配置备用堆栈。当没有在valgrind下运行时,它运行得很好。但是,使用valgrind时,以下代码将失败并显示“Operation not allowed。”
char *sp = X;
size_t stack_size = Y;
...
ss.ss_sp = sp;
ss.ss_size = stack_size;
ss.ss_flags = 0;
if (sigaltstack(&ss, &oss) < 0)
{
DEBUGF("%s()2: %s\n", __func__, strerror(errno));
return false;
}
此代码是Rockbox模拟功能的一部分。如果您愿意,可以通过克隆最新的Rockbox树,构建模拟器并在valgrind下运行它而无需其他选项来重现错误。
答案 0 :(得分:0)
查看valgrind代码,失败的sigaltstack可能是下面补丁解决的错误。
请报告是否修复了错误。 感谢
Index: coregrind/m_signals.c
===================================================================
--- coregrind/m_signals.c (revision 15901)
+++ coregrind/m_signals.c (working copy)
@@ -1124,7 +1124,8 @@
{
ThreadState *tst = VG_(get_ThreadState)(tid);
- return (m_SP - (Addr)tst->altstack.ss_sp < (Addr)tst->altstack.ss_size);
+ return m_SP >= (Addr)tst->altstack.ss_sp
+ && m_SP < (Addr)tst->altstack.ss_sp + (Addr)tst->altstack.ss_size;
}
static Int sas_ss_flags ( ThreadId tid, Addr m_SP )
如果以上操作无法解决问题,则使用以下跟踪运行可能会提示:
--trace-syscalls=yes --trace-signals=yes