2016-07-03 7 views
0

Ich versuche, ein Multithread-Programm unter valgrind arbeiten zu lassen. Es verwendet die sigaltstack() Funktion, um einen alternativen Stapel für einen Signalhandler zu konfigurieren. Wenn es nicht unter valgrind läuft, läuft es perfekt. Wenn Sie Valgrind verwenden, schlägt der folgende Code jedoch mit "Operation nicht zulässig" fehl.Warum versagt sigaltstack() mit "Operation not allowed" nur unter valgrind?

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; 
} 

Dieser Code ist Teil der Rockbox-Simulationsfunktion. Wenn Sie möchten, können Sie den Fehler reproduzieren, indem Sie den neuesten Rockbox-Baum klonen, einen Simulator erstellen und ihn unter valgrind ohne andere Optionen ausführen.

+1

Valgrind soll ordnungsgemäß mit sigaltstack arbeiten. Es gibt einen (sehr minimalen) Test, der sigaltstack syscall aufruft. Bitte erstellen Sie ein minimales Beispiel, das nicht funktioniert, und melden Sie einen Fehler auf https://bugs.kde.org/enter_bug.cgi?product=valgrind Vielen Dank – phd

Antwort

0

Mit Blick auf den Valgrind-Code könnte der fehlerhafte sigaltstack ein Fehler sein, der durch den folgenden Patch behoben wurde.

Bitte melden Sie, wenn es den Fehler behebt. Dank

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) 

Wenn die oben nicht, es zu beheben, mit den unten Spuren laufen könnte einen Hinweis geben:

--trace-syscalls=yes --trace-signals=yes