Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo fornece informações úteis para a depuração de threads, incluindo detalhes sobre como atribuir nomes a threads em código nativo e gerido.
Dicas C/C++
Aqui estão algumas dicas que tu podes usar ao desbugar threads em código nativo:
Você pode exibir o conteúdo do Bloco de Informações do Thread digitando
@TIBna janela Watch ou na caixa de diálogo QuickWatch .Você pode exibir o último código de erro para o thread atual inserindo
@Errna janela Watch ou na caixa de diálogo QuickWatch .As funções C Run-Time Libraries (CRT) podem ser úteis para depurar um aplicativo multithreaded. Para obter mais informações, consulte _malloc_dbg.
Definir um nome de thread em C/C++
A nomeação de threads é possível em qualquer edição do Visual Studio. A nomeação de threads é útil para identificar threads de interesse na janela Threads ao depurar um processo em execução. Ter threads com nomes reconhecíveis também pode ser útil ao realizar a depuração após falhas através da análise de despejos de memória e ao analisar capturas de desempenho utilizando várias ferramentas.
Maneiras de definir um nome de thread
Há duas maneiras de definir um nome de thread. A primeira é através da função SetThreadDescription . O segundo é ao lançar uma exceção específica enquanto o depurador do Visual Studio está ligado ao processo. Cada abordagem tem benefícios e ressalvas. O uso de SetThreadDescription é suportado a partir do Windows 10 versão 1607 ou do Windows Server 2016.
Vale a pena notar que ambas as abordagens podem ser usadas em conjunto, se desejado, uma vez que os mecanismos pelos quais elas funcionam são independentes uma da outra.
Definir um nome de thread usando SetThreadDescription
Benefícios:
- Os nomes de thread são visíveis durante a depuração no Visual Studio, independentemente de o depurador ter ou não sido anexado ao processo no momento em que SetThreadDescription é invocado.
- Os nomes das threads são visíveis durante a depuração pós-morte ao carregar um flash de memória no Visual Studio.
- Os nomes de thread também são visíveis ao usar outras ferramentas, como o depurador WinDbg e o analisador de desempenho do Windows Performance Analyzer .
Advertências:
- Os nomes de thread só são visíveis no Visual Studio 2017 versão 15.6 e versões posteriores.
- Ao realizar a depuração post-mortem de um arquivo de despejo de falha, os nomes de thread só são visíveis se a falha tiver sido criada no Windows 10 versão 1607, Windows Server 2016 ou em versões posteriores do Windows.
Example:
#include <windows.h>
#include <processthreadsapi.h>
int main()
{
HRESULT r;
r = SetThreadDescription(
GetCurrentThread(),
L"ThisIsMyThreadName!"
);
return 0;
}
Definir um nome de thread lançando uma exceção
Outra maneira de definir um nome de thread em seu programa é comunicar o nome de thread desejado para o depurador do Visual Studio lançando uma exceção especialmente configurada.
Benefícios:
- Funciona em todas as versões do Visual Studio.
Advertências:
- Só funciona se o depurador estiver anexado no momento da utilização do método baseado em exceção.
- Os nomes de thread definidos usando esse método não estarão disponíveis em dumps ou ferramentas de análise de desempenho.
Example:
A SetThreadName função mostrada abaixo demonstra essa abordagem baseada em exceções. Observe que o nome do thread será copiado automaticamente para o thread, para que a memória para o threadName parâmetro possa ser liberada após a conclusão da SetThreadName chamada.
//
// Usage: SetThreadName ((DWORD)-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION = 0x406D1388;
#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
void SetThreadName(DWORD dwThreadID, const char* threadName) {
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
#pragma warning(push)
#pragma warning(disable: 6320 6322)
__try{
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
}
__except (EXCEPTION_EXECUTE_HANDLER){
}
#pragma warning(pop)
}
Definir um nome de thread no código gerenciado
A nomeação de threads é possível em qualquer edição do Visual Studio. A nomeação de threads é útil para manter o controle de threads na janela Threads .
Para definir um nome de thread no código gerenciado, use a Name propriedade.
Example
public class Needle
{
// This method will be called when the thread is started.
public void Baz()
{
Console.WriteLine("Needle Baz is running on another thread");
}
}
public void Main()
{
Console.WriteLine("Thread Simple Sample");
Needle oNeedle = new Needle();
// Create a Thread object.
System.Threading.Thread oThread = new System.Threading.Thread(oNeedle.Baz);
// Set the Thread name to "MyThread".
oThread.Name = "MyThread";
// Starting the thread invokes the ThreadStart delegate
oThread.Start();
}