L’indicateur CreateProcess avec DEBUG_PROCESS provoque l’erreur 50 sur certains exécutables

J’essaie d’écrire un petit débogueur. Mon code simplifié est

STARTUPINFOA sui; ZeroMemory( &sui, sizeof(sui) ); sui.cb = sizeof(sui); PROCESS_INFORMATION pi; ZeroMemory( &pi, sizeof(pi) ); DWORD dwFlags = DEBUG_PROCESS; ssortingng program = "program.exe"; if (! CreateProcessA(NULL, (char*) program.c_str(), NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi)) printf("%s failed. LastError = %d", program.c_str(), GetLastError()); 

Sur un grand nombre d’exécutables, cela fonctionne très bien.

Mais par exemple sur les exécutables compilés par C #, ce morceau de code “program.exe a échoué. LastError = 50”. Erreur 50 est ERROR_NOT_SUPPORTED ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx ). Quelle peut être une raison de cela? Comment je peux déboguer toutes sortes de binarys?

Un débogueur non géré ne sera pas très utile pour déboguer un exécutable géré. Découvrez l’ échantillon MDbg pour voir ce que cela prend.

L’erreur ERROR_NOT_SUPPORTED n’est toutefois pas exclusive aux exécutables gérés, bien que plus probablement, vous l’obtiendrez également lorsque vous essayez de déboguer un exécutable 64 bits avec un débogueur 32 bits. Ajoutez la cible de la plate-forme x64 à votre projet pour en créer une version 64 bits.

Cela est dû au fait que vous utilisez CreateProcessA et non CreateProcessW. Passez à la version UNICODE (vous devez toujours l’utiliser dans les nouvelles applications btw.):

 STARTUPINFOW sui; ZeroMemory(&sui, sizeof(sui)); sui.cb = sizeof(sui); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); DWORD dwFlags = DEBUG_PROCESS; wchar_t *program = L"c:\\temp\\test.exe"; if (!CreateProcessW(NULL, program, NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi)) wsprintf(L"%s failed. LastError = %d", program, GetLastError());