Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Thread et deadlock

2 réponses
Avatar
Alain Migeon
Bonjour

J'ai le probl=E8me suivant.

J'ai un programme multithread =E9crit en C++ sous Visual Studio 6.
Lorsque je ferme mon programme, il y a des situations o=F9 une ou=20
plusieurs threads sont bloqu=E9es, provoquant le blocage du programme=20
entier.

Est-il possible, depuis une application ext=E9rieure, de v=E9rifier chacune=
=20
des threads du programme, et d'obtenir un call stack de chacune d'elle?
=20
_________________________________________________
Alain Migeon
Please reverse dynamics and rovsing for replying.

2 réponses

Avatar
Aurelien Regat-Barrel
Alain Migeon a écrit :
Bonjour



Bonjour,

J'ai le problème suivant.

J'ai un programme multithread écrit en C++ sous Visual Studio 6.
Lorsque je ferme mon programme, il y a des situations où une ou
plusieurs threads sont bloquées, provoquant le blocage du programme
entier.

Est-il possible, depuis une application extérieure, de vérifier chacune
des threads du programme, et d'obtenir un call stack de chacune d'elle?



Y'a process explorer:
http://www.sysinternals.com/Utilities/ProcessExplorer.html

Mais le débogueur de VC++ fera bien mieux encore. Mettez sur "pause" une
fois le programme bloquer, vous disposer de la liste des threads, et
pour chacun d'eux la call-stack, et plus encore.
Notez qu'il est possible de donner un nom aux threads figurant dans le
débogueur.

/// Donne un nom au thread appelant cette fonction.
/// Ce nom apparaît dans le débogueur de VC++
void SetCurrentThreadName( const char * ThreadName )
{
#ifdef _MSC_VER // VC++
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // must be 0x1000
LPCSTR szName; // pointer to name (in user addr space)
DWORD dwThreadID; // thread ID (-1Êller thread)
DWORD dwFlags; // reserved for future use, must be zero
} THREADNAME_INFO;

THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = ThreadName;
info.dwThreadID = static_cast<DWORD>( -1 ); // thread courant
info.dwFlags = 0;

__try
{
::RaiseException(
0x406D1388,
0,
sizeof info / sizeof(DWORD),
(DWORD*)&info );
}
__except ( EXCEPTION_CONTINUE_EXECUTION )
{
}
#else
(void*)ThreadName; // éviter les warnings
#endif
}

--
Aurélien Regat-Barrel
Avatar
Alain Migeon
In article <4459e520$0$2651$,
says...
Y'a process explorer:
http://www.sysinternals.com/Utilities/ProcessExplorer.html



J'ai essayé, mais j'ai besoin de plus de détails de chacune des threads .

Mais le débogueur de VC++ fera bien mieux encore. Mettez sur "pause" un e
fois le programme bloquer, vous disposer de la liste des threads, et
pour chacun d'eux la call-stack, et plus encore.



Cette solution n'est pas valide, car la machine sur laquelle est éxécut é
le programme n'a pas Visual Studio.
J'ai en fait trouvé mon salut dans WinDbg (Debugging Tools for Windows),
qui peut être installé indépendemment de Visual Studio. Je dois juste
éxécuter mon program compilé en mode debug, et conserver le .pdb gé néré.

Merci pour ton aide.

_________________________________________________
Alain Migeon
Please reverse dynamics and rovsing for replying.