2010-10-10 2 views
1

Quelqu'un peut-il me dire un code pour la fonction suivante, ce qui soulève EXCEPTION_FLT_STACK_CHECK ou EXCEPTION_BREAKPOINT, car je pourrais les attraper dans le principal func:imitation des exceptions matérielles

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    __try 
    { 
     FaultingStack(); // What I need to write in this function??? 
    } 
    __except(GetExceptionCode() == EXCEPTION_FLT_STACK_CHECK ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
    { 
     return FALSE; 
    } 
    return TRUE; 

    return 0; 
} 

Ne pas suggérer RaiseException Func, je besoin d'un exemple de Code de défaut, pas de logiciel soulevé exception

UPD: Je besoin d'un extrait plus de code pour la prochaine exception EXCEPTION_INT_OVERFLOW

Répondre

2

exception est soulevée Breakpoint facilement. Vous pouvez utiliser une des options suivantes (ce qui est tout de même):

DebugBreak(); // API function 
__debugbreak(); // MSVC intrinsic 
__asm int 3; // Actual instruction 

Maintenant, EXCEPTION_FLT_STACK_CHECK est lié à l'état registre à virgule flottante non valide pile.

premier devrait permettre des exceptions FP liées à la pile FP:

#include <float.h> 
_clearfp(); 
_controlfp(_controlfp(0, 0) & ~(EM_INVALID), MCW_EM); 

Ensuite, faire pile FP overflow/underflow:

for (float f; ;) 
    __asm fstp f; 
1

En supposant MSVC puisque c'est une question de Windows. Vous pouvez obtenir une exception de point d'arrêt en utilisant l'intrinsèque __debugbreak(). Testez sans attacher un débogueur. Une erreur de vérification de pile à virgule flottante nécessite de démasquer les exceptions de sous/dépassement de capacité dans le mot de contrôle FPU. Et, disons, en sautant la pile trop souvent. Je les roulais à la fois dans le programme un exemple:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    // STATUS_BREAKPOINT 
    __debugbreak(); 

    // STATUS_FLOAT_STACK_CHECK 
    _control87(_EM_UNDERFLOW | _EM_OVERFLOW, _MCW_EM); 
    double temp = 0; 
    __asm { 
     fstp [temp] 
     fstp [temp] 
    } 
    return 0; 
} 

`