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