为什么sigaltstack()仅在valgrind下失败并且“不允许操作”?

时间:2016-07-03 17:12:00

标签: signals valgrind

我正在尝试让多线程程序在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下运行它而无需其他选项来重现错误。

1 个答案:

答案 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