Especificadores de formato para C++ no depurador do Visual Studio
Você pode alterar o formato no qual um valor é exibido nas janelas Inspeção , Autos e Locais usando especificadores de formato.
Você também pode usar especificadores de formato na janela Imediato, Comandoem tracepointse até mesmo em janelas de fonte. Se você pausar em uma expressão nessas janelas, o resultado aparecerá em uma DataTip. A exibição DataTip reflete o especificador de formato.
Observação
Quando o depurador nativo do Visual Studio foi alterado para um novo mecanismo de depuração, alguns especificadores de novo formato foram adicionados e alguns antigos removidos. O depurador mais antigo ainda é usado quando você faz a depuração de interoperabilidade (nativa misturada e gerenciada) com C++/CLI.
Definir especificadores de formato
Usaremos o seguinte código de exemplo:
int main() {
int my_var1 = 0x0065;
int my_var2 = 0x0066;
int my_var3 = 0x0067;
}
Adicione a my_var1
variável à janela Inspeção durante a depuração, Depure> a Janela de>Inspeção>Watch 1. Em seguida, clique com o botão direito do mouse na variável e clique em Exibição Hexadecimal. Agora, a janela Inspeção mostra o valor 0x0065. Para ver esse valor expresso como um caractere em vez de um inteiro, primeiro, clique com o botão direito do mouse e desmarque a Exibição Hexadecimal. Em seguida, adicione o especificador de formato de caractere, c na coluna Name depois do nome da variável. A coluna Valor agora mostra 101 'e'.
Você pode exibir e selecionar em uma lista de especificadores de formato disponíveis acrescentando uma vírgula (,) ao valor na janela Inspeção.
Especificadores de formato
As tabelas a seguir descrevem os especificadores de formato que você pode usar no Visual Studio. Especificadores em negrito só têm suporte para o novo depurador e não para depuração de interoperabilidade com C++/CLI.
Especificador | Formatar | Valor original de Inspeção | Valor exibido |
---|---|---|---|
d | inteiro decimal | 0x00000066 | 102 |
o | inteiro octal não assinado | 0x00000066 | 000000000146 |
x h |
inteiro hexadecimal | 102 | 0xcccccccc |
X H |
inteiro hexadecimal | 102 | 0xCCCCCCCC |
xb hb |
inteiro hexadecimal (sem 0x à esquerda) | 102 | cccccccc |
Xb Hb |
inteiro hexadecimal (sem 0x à esquerda) | 102 | CCCCCCCC |
b | inteiro não assinado de binário | 25 | 0b00000000000000000000000000011001 |
bb | inteiro não assinado de binário (sem 0b à esquerda) | 25 | 00000000000000000000000000011001 |
e | notação científica | 25000000 | 2.500000e+07 |
g | mais curto do ponto flutuante ou científico | 25000000 | 2.5e+07 |
c | caractere único | 0x0065 | 101 'e' |
s | cadeia de caracteres const* (sem aspas) | <location> "hello world" | “Olá Mundo” |
sb | cadeia de caracteres const char* (sem aspas) | <location> "hello world" | hello world |
s8 | Cadeia de caracteres UTF-8 | <location> "This is a UTF-8 coffee cup ☕" | "This is a UTF-8 coffee cup ☕" |
s8b | Cadeia de caracteres UTF-8 (sem aspas) | <location> "hello world" | hello world |
su | Cadeia de caracteres Unicode (codificação UTF-16) (sem aspas) | <location> L"hello world" | L"hello world" u"hello world" |
sub | Cadeia de caracteres Unicode (codificação UTF-16) (sem aspas) | <location> L"hello world" | hello world |
bstr | Cadeia de caracteres binária BSTR (com aspas) | <location> L"hello world" | L"hello world" |
env | Bloco de ambiente (cadeia de caracteres terminada em nulo duplo) | <location> L"=::=::\\" | L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=... |
s32 | Cadeia de caracteres UTF-32 (com aspas) | <location> U"hello world" | U"hello world" |
s32b | Cadeia de caracteres UTF-32 (sem aspas) | <location> U"hello world" | hello world |
en | enum | Saturday(6) | Sábado |
hv | Tipo de ponteiro – indica que o valor do ponteiro inspecionado é o resultado da alocação de heap de uma matriz, por exemplo, new int[3] . |
<local>{<first member>} | <local>{<first member>, <second member>, ...} |
na | Inibe o endereço de memória de um ponteiro para um objeto. | <location>, {member=value...} | {member=value...} |
nd | Exibe somente as informações de classe base, ignorando classes derivadas | (Shape*) square inclui informações de classe raiz e derivada |
Exibe apenas informações de classe raiz |
h | Código de erro HRESULT ou Win32. Esse especificador não é mais necessário para HRESULTs, já que o depurador os decodifica automaticamente. | S_OK | S_OK |
wc | Sinalizador de classe do Windows | 0x0010 | WC_DEFAULTCHAR |
wm | Números de mensagens do Windows | 16 | WM_CLOSE |
nr | Suprimir item "Raw View" | ||
nvo | Mostrar o item "Exibição Bruto" somente para valores numéricos | ||
! | formato bruto, ignorando qualquer personalização de exibições de tipo de dados | <representação personalizada> | 4 |
Identificador | Exibe informações sobre o identificador win32 | 0x000000000000009c | Exibe informações úteis sobre o identificador, como a ID do thread, etc. |
Observação
Quando o especificador de formato hv está presente, o depurador tenta determinar o comprimento do buffer e exibir esse número de elementos. Como nem sempre é possível que o depurador localize o tamanho exato do buffer de uma matriz, você deve usar um especificador de tamanho (pBuffer,[bufferSize])
sempre que possível. O especificador de formato hv é útil quando o tamanho do buffer não está prontamente disponível.
Especificadores de tamanho para ponteiros como matrizes
Se você tiver um ponteiro para um objeto que queira exibir como uma matriz, poderá usar um inteiro ou uma expressão para especificar o número de elementos da matriz.
Especificador | Formatar | Valor original de Inspeção | Valor exibido |
---|---|---|---|
n | Inteiro decimal ou inteiro hexadecimal | pBuffer,[32] pBuffer,[0x20] |
Exibe pBuffer como uma matriz de elementos de 32. |
[exp] | Uma expressão C++ válida que é avaliada como um inteiro. | pBuffer,[bufferSize] | Exibe o pBuffer como uma matriz de bufferSize elementos. |
expand(n) | Uma expressão C++ válida que é avaliada como um inteiro | pBuffer, expand(2) | Exibe o terceiro elemento de pBuffer |
Especificadores de formato para depuração de interoperabilidade com C++/CLI
Especificador | Formatar | Valor original de Inspeção | Valor exibido |
---|---|---|---|
o | inteiro octal não assinado | 0xF065 | 0170145 |
x X |
Inteiro hexadecimal | 61541 | 0x0000f065 |
c | caractere único | <local> | 101 'e' |
s | carac const* (com aspas) | <local> | “Olá Mundo” |
su | const wchar_t* carac const16_t (com aspas) |
<local> | L"hello world" |
sub | const wchar_t* carac const16_t* |
<local> | hello world |
s8 | carac const* (com aspas) | <local> | “Olá Mundo” |
h | Código de erro HRESULT ou Win32. Esse especificador não é mais necessário para HRESULTs, já que o depurador os decodifica automaticamente. |
S_OK | S_OK |
wc | Sinalizador de classe do Windows | 0x00000040, | WC_DEFAULTCHAR |
wm | Números de mensagens do Windows | 0x0010 | WM_CLOSE |
! | formato bruto, ignorando qualquer personalização de exibições de tipo de dados | <representação personalizada> | 4 |
Os especificadores d, e, f, g, h, i, l, m, ma, mb, md, mq, mu, mw e u para código nativo e C++/CLI exigiram o depurador herdado, que não tem suporte no Visual Studio 2022 ou versões posteriores.
Especificadores em negrito têm suporte apenas para depuração de código nativo e C++/CLI. Esses especificadores exigem o depurador herdado, especificado usando o Modo de Compatibilidade Gerenciada.
Especificador | Formatar | Valor original de Inspeção | Valor exibido |
---|---|---|---|
d i |
inteiro decimal assinado | 0xF000F065 | -268373915 |
u | inteiro decimal não assinado | 0x0065 | 101 |
o | inteiro octal não assinado | 0xF065 | 0170145 |
x X |
Inteiro hexadecimal | 61541 | 0x0000f065 |
l h |
prefixo longo ou curto para: d, i, u, o, x, X | 00406042 | 0x0c22 |
f | ponto flutuante assinado | (3./2.), f | 1.500000 |
e | notação científica assinada | (3.0/2.0) | 1.500000e+000 |
g | ponto flutuante assinado ou notação científica assinada, o que for menor |
(3.0/2.0) | 1.5 |
c | caractere único | <local> | 101 'e' |
s | carac const* (com aspas) | <local> | “Olá Mundo” |
su | const wchar_t* carac const16_t (com aspas) |
<local> | L"hello world" |
sub | const wchar_t* carac const16_t* |
<local> | hello world |
s8 | carac const* (com aspas) | <local> | “Olá Mundo” |
h | Código de erro HRESULT ou Win32. Esse especificador não é mais necessário para HRESULTs, já que o depurador os decodifica automaticamente. |
S_OK | S_OK |
wc | Sinalizador de classe do Windows | 0x00000040, | WC_DEFAULTCHAR |
wm | Números de mensagens do Windows | 0x0010 | WM_CLOSE |
! | formato bruto, ignorando qualquer personalização de exibições de tipo de dados | <representação personalizada> | 4 |
Especificadores de formato para locais de memória na depuração de interoperabilidade com C++/CLI
A tabela a seguir contém os símbolos de formatação usados para locais de memória. Você pode usar um especificador de local da memória com qualquer valor ou expressão que seja avaliada como um local.
Especificadores em negrito têm suporte apenas para depuração de código nativo e C++/CLI. Isso requer o depurador herdado, especificado usando o Modo de Compatibilidade Gerenciada.
Símbolo | Formatar | Valor original de Inspeção | Valor exibido |
---|---|---|---|
ma | Caracteres ASCII na base 64 | 0x0012ffac | 0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1 |
m | 16 bytes em hexadecimal, seguidos caracteres ASCII na base 16 | 0x0012ffac | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&. |
mb | 16 bytes em hexadecimal, seguidos caracteres ASCII na base 16 | 0x0012ffac | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&. |
mw | 8 palavras | 0x0012ffac | 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000 |
md | 4 palavra duplas | 0x0012ffac | 0x0012ffac 00CB34B3 80943084 308A22FF 00002657 |
mq | 2 palavras quádruplas | 0x0012ffac | 0x0012ffac 7ffdf00000000000 5f441a790012fdd4 |
mu | Caracteres de 2 bytes (Unicode) | 0x0012ffac | 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000 |
Especificador de tamanho para ponteiros como matrizes na depuração de interoperabilidade com C++/CLI
Se você tiver um ponteiro para um objeto que você deseja exibir como uma matriz, poderá usar um inteiro para especificar o número de elementos da matriz.
Especificador | Formatar | Expression | Valor exibido |
---|---|---|---|
n | Inteiro decimal | pBuffer[32] | Exibe pBuffer como uma matriz de 32 elementos. |