2017-11-12 4 views
-1

Ich schreibe gerade meine eigene Threading-Bibliothek. Und ich bin nicht in der Lage, eine unbehandelte Ausnahme zu debuggen "Stack-Cookie-Instrumentierungscode hat einen stapelbasierten Pufferüberlauf erkannt". Unten ist der Code in Frage, dass die nicht behandelte Ausnahme verursachtC Thread-Planung (und asm)

void Scheduler() 
{ 

    void *curr_esp; 
    TCB* next_thread = ready_queue->data; 
    popFront(&ready_queue); 
    __asm 
    { 
pushad 
mov curr_esp, esp 
    } 
    curr_thread->esp = curr_esp; 

    if (curr_thread->status == RUNNING) 
    { 
    curr_thread->status = READY; 
    Enqueue(curr_thread, &ready_queue); 

    } 

    curr_thread = next_thread; 

    if (curr_thread->status == READY) 
    { 
    curr_thread->status = RUNNING; 

    curr_esp = next_thread->esp; 
__asm 
{ 
    mov esp, curr_esp 
    popad 
} 

} 

else if (curr_thread->status == NEW) 
{ 
    curr_thread->status = RUNNING; 
    curr_thread->params = (curr_thread->fn)(curr_thread->params); 
    __asm 
    { 
     mov esp,curr_esp 
    } 
    if (curr_thread->status == RUNNING) 
    { 
     thread_exit(curr_thread->params); 
    } 

    } 
} 

Dies ist der Haupt die threadlib und thd_yield im Grunde nur ruft meinen Scheduler

void *spin1(void *a) 
{ 
    int i; 
    for(i=0;i< 20; i++) 
    { 
     printf("SPIN1\n"); 
     if((i+1)%4==0) 
      thd_yield(); 
    } 
    return NULL; 
} 

void* spin2(void *a) 
{ 
    int i; 
    for(i=0;i< 20; i++) 
    { 
     printf("SPIN2\n"); 
     if((i+1)%4==0) 
      thd_yield(); 
    } 
    return NULL; 
} 


int main() 
{  
    thread_id_ id; 
    thd_init(); 
    id = new_thd(spin2, NULL); 
    spin1(NULL); 
} 

Die Ausgabe soll dabei die Spin-Funktion, die angenommen hat, laufen ist um 5 Sätze von 4 "Spin1" und "Spin2" abwechselnd zu sein.

Spin1 Spin1 Spin1 Spin1 Spin2 Spin2 Spin2 Spin2 Spin1 ..

Der Code funktioniert für die ersten 2 Sätze von "Spin1" s und 1, völlig in Ordnung, aber gibt mir eine unbehandelte Ausnahme auf der 2. Reihe von "spin2" s. Ich habe die Stapelzeiger überprüft, die gespeichert und abgerufen werden, und sie werden korrekt gespeichert und abgerufen, der Speicher der verknüpften Liste und Speicherzuweisungen. Was noch schlimmer ist, ist, dass mir nicht angezeigt wird, welche Zeile den Fehler verursacht.

HINWEIS: Ich erlauben keine Thread Systemaufrufe zu verwenden, und es hat in C.

Hier zu sein ist mein TCB struct wenn es

typedef struct _TCB_ 
{ 
    /* Unique ID*/ 
    thread_id_ id; 
    /* Thread status*/ 
    enum ThreadState status; 
    /* ID of next thread*/ 
    thread_id_ wait_id; 

    void *esp; 

    void *(*fn)(void*); 

    void *params; 

    void *stack; 

}TCB; 

hilft werde ich gerne meine Quelle teilen Datei, wenn es Ihnen bei der Lösung dieses Problems hilft.

+0

Dieser Artikel kann Ihnen einige Hinweise geben https: // kallanreed.wordpress.com/2015/02/14/disilbling-the-stack-cookie-generation-in-visual-studio-2013/ – clover

+1

Scheint, dass die Antwort auf diese Frage davon abhängen könnte, welche Version von welchem ​​Compiler Sie verwenden, und auf Mit welchen Optionen kompilieren Sie sich. –

Antwort

2

Kurz gesagt, etwas stört den Stack-Cookie.

Stack-Cookie wird berechnet und am Ende des aktuellen Stack-Frames gespeichert, bevor der Funktionscode ausgeführt wird. Wenn die Ausführung des Funktionscodes beendet ist, wird sie validiert. Im Falle eines Pufferüberlaufs wird dieser überschrieben und die Validierung schlägt fehl. Aus diesem Grund kann es Ihnen keine Zeile melden, die das Problem verursacht hat.

Möglicherweise gibt es in Ihrem Fall mehrere Gründe für diese Ausnahme. Da es ohne den gesamten Code schwer zu sagen ist, werde ich einige Annahmen getroffen werden:

  • Sie tatsächlich einen Puffer überrannt haben. Der eseast Weg zu prüfen ist, die Stapelplätzchen-Sicherheitsprüfung zu deaktivieren und zu sehen, wenn Sie "Zugriffsverletzung" Ausnahme haben. Auch wenn Sie dies nicht tun, kann es immer noch ein Pufferüberlauf sein.
  • Stapelzeiger verschiedener Threads zeigen auf einen überlappenden Speicherbereich. Dies kann passieren, wenn Sie nicht genügend Speicher für den Stack zuweisen - was ist ein Puffer überschritten sowieso.
  • Sehr unwahrscheinlich, aber Ihr Code kann richtig sein, aber es ist nicht kompatibel mit Stapel Cookie Sicherheitscheck, so müssen Sie es kompatibel machen oder deaktivieren Sie die Prüfung. Die einzige Empfehlung hier ist, aktivieren Sie Assembler-Ausgang und überprüfen Sie es.
+0

Hallo! Danke für deine Antwort. Wenn es möglich ist, kann ich Ihnen meine Quelldateien senden? Vielleicht kannst du etwas sehen, was ich stundenlang nicht konnte. –

+0

Ich denke wirklich, es wäre besser für Ihre Studien, um es selbst zu erkennen. – clover

+0

Ich habe alles versucht, was mir einfällt, weshalb ich hier poste. Ich bin normalerweise in der Lage, meine eigene Arbeit zu debuggen, aber das fühlt sich wirklich an, als würde ich meinen Kopf gegen eine Wand schlagen. Ich habe alles gemacht, was ich mir vorstellen kann. Umschreiben meiner verketteten Liste, Neuschreiben des gesamten Schedulers (4 Mal jetzt), Mit dem Speicherdiagnose-Tool, um auf unbeabsichtigte Speicherzuordnungen und Freigaben zu überprüfen, alle ordnungsgemäß ausgecheckt. Überprüfen der Stapelzeiger, die ich durch asm manipuliert habe. Und ich kann immer noch nichts falsch sehen. –