2009-03-13 6 views
9

Siempre que quiero un punto de interrupción en algún lugar donde tampoco hay nada para romper el solo (dentro de un bucle, & c), que tienden a desplegará automáticamente un:int i = 2; // ¿Qué usas como una línea de usar y tirar cuando solo necesitas algo para romper?

int i = 2; 

Tengo curiosidad por lo usan otros.

+0

¿por qué está marcado para cerrar? –

+0

Porque la etiqueta SFQ se usa en exceso. –

+3

Nunca he tenido que insertar una línea para romper ... –

Respuesta

4
console.write("stop here") 

En .net utilice siempre exactamente esa línea, no tengo idea de por qué, sólo tiene desde hace años.

+0

Me gusta; se explica por sí mismo. – rektide

+0

Y si su consola está pidiendo detenerse en una compilación de lanzamiento, sabe que dejó algo en el paciente ;-) – RBerteig

11

Visual Studio le permite romper con un corsé.

+2

¿Y si no puede usar VS? Muchos depuradores no permiten esto, o trabajan en una plataforma diferente de Windows? – xan

2

En C#, rompo la llave final, y en VB.NET rompo en el extremo If/Sub/Function/whatever.

1
Console.Writeline(e.Message); 
2

bool breakHere = true;

Es auto-documentado!

3
(void *)"Insert witty comment."
7

Si se trata de C++ en un equipo x86, sólo tiene que utilizar:

__asm int 3 

y sólo esperar a excepción de golpear. Ni siquiera tiene que comenzar en el depurador en Windows, o usa un buen ole DebugBreak().

+0

esto también funciona: * ((char *) 0) = 0; – vrdhn

+0

Parece más fresco sin el paréntesis redundante: * (int *) 0 = 0; es lo que uso :) – unwind

+1

Con la interrupción, puede continuar con la ejecución, el depurador le permite continuar sin problemas. Al lanzar una excepción no controlada, obtienes un descanso en el depurador, pero no puedes continuar sin establecer la siguiente declaración. –

7

Thee no necesita un código de descarte.
Puede poner un punto de quiebre incluso dentro de la declaración de bucle "for";
Mover el cursor sobre "por" declaración de bucle y presione F9

alt text

+2

Estás haciendo una suposición sobre el entorno en el que está trabajando aquí. – SpoonMeiser

+0

Sí, no hubo un entorno específico que la pregunta mencionó. Por cierto, buen nombre. Nuestros nombres casi riman;) – Sung

3
asm { int3 } 

Pero yo soy un loco: D

9

En .NET Framework (usando C# aquí):

System.Diagnostics.Debugger.Break(); 

Para evitar escribir esto cada vez solo crea e un nuevo fragmento de código para su idioma preferido:

<?xml version="1.0" encoding="utf-8" ?> 
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> 
    <CodeSnippet Format="1.0.0"> 
    <Header> 
     <Title>sddb</Title> 
     <Shortcut>sddb</Shortcut> 
     <Description> 
     Code snippet for System.Diagnostics.Debugger.Break() 
     </Description> 
     <Author>Peter McGrattan</Author> 
     <SnippetTypes> 
     <SnippetType>Expansion</SnippetType> 
     </SnippetTypes> 
    </Header> 
    <Snippet> 
     <Code Language="csharp"> 
     <![CDATA[System.Diagnostics.Debugger.Break();$end$]]> 
     </Code> 
    </Snippet> 
    </CodeSnippet> 
</CodeSnippets> 
1

hago lo mismo con el valor int pero mi favorito es

int y=1; 
5
i = i; 

o cualquier variable definida en el alcance.

En C#/VS se obtiene una advertencia del compilador, por lo que es también un buen método para marcar código que no ha terminado, etc.

+0

Podría causar problemas si anula el operador = en C++ (¡y está mal escrito!). – strager

0

String foo = "bar";

1
int moo = 42; 

¿Por moo? No lo sé, solo viene a la mente. ¿Por qué 42? ¿Por qué no lo elegirías?

1
int x = 0; 
x = x; 
3

Cuál es el punto de inserción de código de romper? ¿No hay ya un código donde quieres romper? Acabo de poner el punto de interrupción en la línea real en cuestión; mi IDE (Eclipse) se detiene antes de ejecutar esa línea. Parece bastante fácil.

Ahora, antes de aprender sobre los puntos de interrupción condicionales, solía agregar código para probar las condiciones interesantes para no interrumpir cada iteración de ciclo o cada llamada de una función comúnmente utilizada.

1

En la mayoría si no todos los depuradores de JavaScript Puede utilizar la instrucción

debugger; 

, que se comporta como un punto de interrupción.

2

yo uso esto en C#:

If (Debugger.IsAttached) 
    Debugger.Break(); 

lanzo la IsAttached de manera que si no se eliminan que no afecta el código de producción.

0

Consideremos las propiedades deseables. El código debe

  1. ser capaces punto de interrupción-
  2. explica claramente que es allí sólo por los puntos de interrupción.
  3. no debe ser inmediatamente visible para un usuario que lo ejecute.
  4. no afecta el comportamiento en tiempo de ejecución (incluido el tiempo de ejecución).

Según el optimizador que utilice, el mejor código de punto de interrupción puede variar.

No soy mucho para agregar ensamblaje. No es portátil y estropea el análisis del compilador del código circundante. Incluso si no es operativo, podría afectar el rendimiento.

La impresión es visible por el usuario. Hablar con el depurador se siente como si estuvieras haciendo algo mal. He escuchado historias sobre cómo desaparecieron los errores de enhebrado cuando el código se ejecutó en el depurador (y así es como los depuradores obtuvieron su nombre: D). Diría que es algo que hay que evitar, y los problemas que resuelve deberían resolverse con un mejor depurador (¿un parche de mono fácil de usar, tal vez?).

Creo que el mejor código es bool breakpoint_dummy = /* the value means nothing */ false;. Encaja en 80 columnas, explica qué es, y si su compilador de optimización no puede tratar con las variables no utilizadas, (¿ojalá?) Compilará al xorl eax, eax, un código rápido y pequeño (supongo). En general, los ceros son más baratos que los ;-)

3

en C/C++ se puede utilizar un no-op:

;

0

Lo que siempre he hecho es hacer algún tipo de #define, por ejemplo, (VC++):

#define NOP __asm{nop} 

Esto puede ser fácilmente otra cosa para diferentes plataformas, p.(Gcc):

#define NOP asm("nop") 

Si no hay un lenguaje ensamblador en línea, usted puede eludir en algo sensato:

/* insert directives to prevent inlining and optimization */ 
void nop() {} 

#define NOP (nop()) 

También se puede convertir en nada por las compilaciones que no desea en:

#define NOP ((void)0) 

Este tipo de cosas pueden ir a donde sea que vayan los typedefs específicos de la plataforma y demás.

Cuestiones relacionadas