Sunday, October 23, 2016

Opciones De Binario De Formato De Impresión Gdb

8.4 Formatos de salida De forma predeterminada, GDB imprime un valor según su tipo de datos. A veces esto no es lo que quieres. Por ejemplo, es posible que desee imprimir un número en hexadecimal, o un puntero en decimal. O puede que desee ver los datos en la memoria en una dirección determinada como una cadena de caracteres o como una instrucción. Para hacer estas cosas, especifique un formato de salida al imprimir un valor. El uso más simple de los formatos de salida es decir cómo imprimir un valor ya calculado. Esto se hace iniciando los argumentos del comando de impresión con una barra diagonal y una letra de formato. Las letras de formato soportadas son: x Considere los bits del valor como un entero e imprima el entero en hexadecimal. D Imprimir como entero en decimal firmado. U Imprimir como entero en decimal sin signo. O Imprimir como entero en octal. T Imprimir como entero en binario. La letra t significa dos. (2) a Imprimir como una dirección, tanto absoluta en hexadecimal como como un desplazamiento del símbolo precedente más cercano. Puede utilizar este formato para descubrir dónde (en qué función) se encuentra una dirección desconocida: El símbolo de información de comando 0x54320 produce resultados similares. Vea el símbolo info de la sección. C Considerar como un entero e imprimirlo como una constante de carácter. F Considere los bits del valor como un número de punto flotante e imprima utilizando la sintaxis típica de coma flotante. Por ejemplo, para imprimir el contador de programas en hexadecimal (vea la sección 8.10 Registros), escriba Note que no es necesario espacio antes de la barra porque los nombres de comandos en GDB no pueden contener una barra diagonal. Para volver a imprimir el último valor en el historial de valores con un formato diferente, puede utilizar el comando print con sólo un formato y sin expresión. Por ejemplo, p / x reimprime el último valor en hex. GNU GDB Debugger Comando Cheat Sheet Compile con la opción - g (para la mayoría de los compiladores de GNU e Intel) que genera información adicional en el código de objeto para que el depurador pueda coincidir con una línea de origen Código con el paso de ejecución. No utilice la directiva de optimización del compilador como - O u - O2 que reorganizan las operaciones de cálculo para aumentar la velocidad ya que este reordenamiento no coincide con el orden de ejecución en el código fuente y puede ser imposible de seguir. Controlc: Detener la ejecución. Se puede detener el programa en cualquier lugar, en su fuente o una biblioteca C o en cualquier lugar. Para ejecutar un comando de shell: comando o comando de shell Comando de GDB: Use TAB key info bre TAB completará el comando resultando en puntos de interrupción de información Presione TAB dos veces para ver todas las opciones disponibles si hay más de una opción disponible o escriba M-RETURN. De-Referencing STL Containers: La visualización de las clases de contenedores STL usando el nombre de variable de GDB p da como resultado una visualización críptica de definiciones de plantilla y punteros. Utilice los siguientes /. Archivo gdbinit (V1.03 09/15/08). Ahora funciona con GDB 4.3. (Versiones archivadas: V1.01 GDB 6.4 solamente) Gracias al Dr. Eng. Dan C. Marinescu por el permiso para publicar este guión. Utilice los siguientes comandos proporcionados por el script: Tengo GDB pero el binario Quiero ingeniero inverso dinámicamente no tiene símbolos, que es cuando ejecuto la utilidad de archivo que me muestra despojado: Qué opciones tengo si el entorno en el que se ejecuta doesnt Permita que una instancia IDA Pro remota se conecte a gdbserver. En pocas palabras: el entorno que tienes es limitado en lo que te permite hacer, pero tienes gdb viejo fiel y un binario para hacer ingeniería inversa. 27 de abril a las 3:13 Convenios utilizados más comentarios preliminares Estoy recortando la salida de GDB para la brevedad, ya que por lo general muestra el derecho de autor y otra información al comienzo de cada sesión. Cuando reproduzco la salida, Ill comienza en la primera línea de solicitud (gdb), o en caso de comandos auto-ejecutados desde la primera línea de salida genuina. Con el fin de distinguir los comandos introducidos en el indicador de GDB, estos tendrán un líder (gdb) al igual que en el mundo real. Para el comando shell esto no será ningún prefijo en absoluto o como parece ser la convención en la mayoría de los sistemas unixoid. Cuando uso un comando en particular, como vim como mi editor, eres libre de usar tu propio editor favorito por supuesto. Ya sea emacs o nano. No lo juzgaré) Inicio Esta sección trata de configurar su entorno gdb e iniciar el proceso. Ill también incluyen algunos tidbits para los recién llegados completos. Trucos que debes saber GDB tiene un buen mensaje en el que el cursor se detendrá después de que el programa se rompa o cuando esté pisando o algo así. Al pulsar RETURN (aka ENTER) después de ejecutar un comando GDB volverá a ejecutar el mismo comando. Esto es útil cuando está avanzando a través del código con paso o siguiente y simplemente desea continuar uno por uno. Los comandos pueden abreviarse siempre que no sean ambiguos. Para algunos de los comandos utilizados, existe una abreviatura en particular que tiene precedencia a pesar de la ambigüedad: b para la ruptura (a pesar de bt y backtrace) c o cont para continuar (a pesar de la captura de llamada y así sucesivamente) n para el siguiente (a pesar ni y nexti) Funciones de biblioteca reales o incluso funciones desde el programa depurado utilizando la llamada de comando. Esto significa que usted puede probar el comportamiento o el comportamiento de la fuerza. Puede iniciar GDB con gdbtui o gdb - tui para obtener una interfaz de usuario de texto visual más supuestamente más conveniente. Muestra el código fuente en la parte superior y el indicador (gdb) a continuación. También puede cambiar a este diseño ejecutando el comando src de configuración en el indicador (gdb). GDB tiene una característica de finalización de línea de comandos muy similar a muchos shells, así que utilice Tab para su ventaja y también asegúrese de usar ayuda o help keywordcommand siempre que necesite ayuda. Shell le permite ejecutar comandos en el shell, para que pueda ejecutar comandos desde su sesión de GDB. Durante el desarrollo, un ejemplo sería shell make. impresión. Examinar y mostrar conocer varios formatos (/ FMT) que puede utilizar para hacer la salida más legible. Cuando la depuración a nivel de fuente puede utilizar tipos de tipo C para mostrar valores. Imagine una cadena C detrás de un vacío (que GDB sabe gracias a los símbolos en tal caso). Simplemente colóquela en (char) e imprima: print (char) variable. Cómo ejecutar el proceso Debido a que queremos analizar dinámicamente el binario, necesitamos iniciarlo primero. Línea de comando Podemos hacerlo directamente desde la línea de comandos, pasando no sólo la ruta al binario, sino también los argumentos con los que queremos iniciarlo. Todo el proceso se ve así: Fácil. Desde el indicador (gdb), puede emitir el comando run (abreviatura r) para ejecutar ./exe con los parámetros dados en la línea de comandos. Yo prefiero este método, pero su kilometraje puede variar. GDB prompt Encienda GDB y en el prompt (gdb) utilice el comando file para cargar el binario y luego use el comando run para iniciarlo con los argumentos que desea pasar: una alternativa a lo anterior sería el uso de set args like Esto: También puede ver en cualquier caso que los argumentos pasados ​​pasarían al proceso iniciado emitiendo un: btw: si se estaba preguntando acerca de las variables de entorno, utilice el comando de ayuda incorporado de GDB como conjunto de ayuda y ayuda. Punteros: establezca entorno VARNAMEVALUE y muestre el entorno VARNAME y desactive el entorno VARNAME. Phew, pero por qué el programa se detiene con un SIGSEGV (falla de segmento) Bueno, no sabemos todavía, pero parece que este pequeño beasty quiere el tratamiento adecuado. Dado que practicamos la informática defensiva, no queremos ejecutar nada de lo que no sabemos mucho, así que vamos a empezar de nuevo. Si esto hubiera sido malware wed tiene que vaciar la máquina y reinstalar o restaurar una instantánea si es un invitado de VM. Primero queremos ejecutar el comando info de la siguiente manera: Hay dos partes importantes de información, la más relevante para nosotros es la línea indicando: bien, así que podemos establecer un punto de ruptura en ese y luego ejecutar el proceso con los argumentos que lujoso..gdbinit para la victoria Pero espera, esto ya es tedioso. Ningún método fácil de automatizar estos pasos de alguna manera Como una cuestión de hecho hay. Un archivo denominado. gdbinit puede utilizarse para emitir comandos a GDB al iniciar. También puede pasar un archivo con comandos GDB usando el argumento - x en la línea de comandos (shell). Si tengo un número de proyectos, por lo general están en subcarpetas con un archivo. gdbinit cada uno. Nota lateral: - nx evita que el contenido. gdbinit se ejecute al iniciar. Así que sabemos qué argumentos queremos pasar y sabemos la dirección del punto de interrupción, esto se traduce en el siguiente archivo. gdbinit: La salida que obtengo al iniciar gdb sin ningún otro argumento es: Niza Pero esto parece diferente. Asamblea y GDB Así que usted está acostumbrado a ver la siguiente línea que va a ejecutar y luego su fiel antiguo (gdb) prompt. Pero no hay tal cosa. No tenemos ninguna fuente para este binario y además símbolos. Doh Así que contemplamos el parpadeo del cursor en el prompt (gdb) y nos preguntamos qué hacer. No se preocupe, GDB también puede manejar código de ensamblaje. Único problema, por defecto a la sintaxis - en mi opinión - inconveniente ATampT montaje. Prefiero el sabor de Intel y el siguiente comando le dice a GDB que haga exactamente eso: Mostrar el código de ensamblaje Y como nos va a mostrar el código de ensamblaje Bueno, similar al modo TUI (compruebe la etiqueta wiki para gdb) usando lo siguiente Comando: y si usted está tan inclinado, también: que también le mostrará el contenido de los registros en una visión general. Vamos a ejecutarlo de nuevo Así que terminamos con el siguiente. gdbinit para nuestros propósitos: Y cuando empezamos gdb sin argumentos terminamos con esto: Dulce. Así podemos ver el desmontaje mientras pasamos por el código. Podríamos concluir esto aquí, pero por supuesto hay más trucos que aprender, así que por qué no ir un poco más allá. NOTA: los registros con fondo blanco / gris muestran que un valor ha cambiado. No demasiado significativo cuando acabamos de iniciar el programa, pero poderoso útil cuando paso a través de código más adelante. Btw, si prefieres guardar la propiedad de la pantalla y tenerla menos visual, comenzando con GDB 7.0 puedes usar: en las versiones de GDB antes puedes emular el comportamiento de los ajustes de una pantalla automática: o más corto disp / i pc donde / i es el Formato, usted puede recordarlo mejor pensando la instrucción y la PC que es el puntero de la instrucción, también conocido como contador del programa - de ahí PC. También es bueno saber Algunas veces, al pasar por el ensamblaje, las vistas regs y asm se obtendrán. Simplemente ejecute los comandos de disposición respectivos de nuevo para restaurarlos a su antigua gloria: Depuración en el nivel de ensamblaje Cuando se está en el modo de ensamblaje, algunos de los comandos a los que está acostumbrado desde la depuración a nivel de fuente simplemente no funcionarán. Eso tiene sentido, porque una sola línea de origen significa normalmente una docena de instrucciones o más. Los comandos siguientes y de paso, sin embargo, tienen contrapartes de nivel de instrucción: nexti (sténesis ni cualquier otra persona que piensa en arbustos) stepi (abreviatura si) Desde nuestro desmontaje arriba sabemos: y para todos los propósitos prácticos esta es la función principal. Por supuesto, si usted fuera a ingeniería inversa malware que debe ser más cuidadoso, pero en este caso lo es. Así que vamos a añadir un punto de interrupción a esta dirección (0x40f961) en lugar del punto de entrada: Si examinamos (abreviatura x) el código en el que estamos actualmente, podemos ver: Bueno, la llamada es lo que queremos seguir, Dentro de ella usando si. Podemos ver otra llamada inmediatamente en el puntero de instrucción al ingresar a la función: La llamada nos lleva a una función que llama a ptrace (PTRACETRACEME.). Ahora, por qué haría eso? Bueno, es un viejo truco anti-depurador que Mellowcandle ha descrito en otro QampA aquí: Pero cómo lo conseguimos alrededor de Wed tiene que sobrescribir la llamada a la función que llama a ptrace () con nop o algo similar Esas líneas. Aquí es donde GDB se vuelve un poco difícil de manejar. Pero podemos usar set así que haz la magia para nosotros. Permite primero inspeccionar los bytes de instrucción: El 0xe8 es una instrucción de llamada y ahora sabemos que tiene 5 bytes de longitud. Así que deja nop esto. (X / 10b pc significa examinar 10 bytes en el contador del programa - el formato por defecto ya es hexadecimal). Así que hacemos mientras detenido en 0x40911f: y verificar la ubicación de parches: Excelente. Ahora podemos ejecutarlo. Alternativas al método dado alternativa para el parche: conjunto 0x40911f 0x90909090 seguido por conjunto 0x409123 0x90 Manipular el contador de programa (puntero de instrucción) en su lugar: conjunto pc5 o el conjunto más explícito pcpc5 salto pc5 Mejores maneras de manipular / parche el programa en ejecución Hay alternativas (Y manera superior) métodos como éste por Tavis Ormandy. Im que reproduce la macro del montaje abajo (en caso de que vaya fuera de línea del otro lugar): De nuevo el fragmento de la escritura antedicho wasnt escrito por mí, pero por Tavis Ormandy - vea el acoplamiento arriba. Esto concluye esta pequeña QampA.8. Examinar datos La forma usual de examinar los datos en su programa es con el comando print (abreviado p), o su sinónimo inspeccionar. Evalúa e imprime el valor de una expresión del idioma en el que está escrito su programa (consulte la sección Uso de GDB con diferentes idiomas). Print expr print / f expr expr es una expresión (en el idioma de origen). Por defecto, el valor de expr se imprime en un formato apropiado para su tipo de datos, puede elegir un formato diferente especificando / f. Donde f es una letra que especifica el formato, vea Formatos de salida. Print print / f Si omite expr. GDB vuelve a mostrar el último valor (del historial de valores, véase la sección Historial de valores). Esto le permite inspeccionar convenientemente el mismo valor en un formato alternativo. Una forma más baja de examinar los datos es con el comando x. Examina los datos en la memoria en una dirección especificada y la imprime en un formato especificado. Consulte la sección Examinar la memoria. Si está interesado en información sobre tipos o sobre cómo se declaran los campos de una estructura o una clase, utilice el comando ptype exp en lugar de imprimir. Consulte la sección Examinar la tabla de símbolos. 8.1 Impresión de expresiones y muchos otros comandos de GDB aceptan una expresión y calculan su valor. Cualquier tipo de constante, variable o operador definido por el lenguaje de programación que está utilizando es válido en una expresión en GDB. Esto incluye expresiones condicionales, llamadas de función, moldes y constantes de cadena. Por desgracia, no incluye los símbolos definidos por preprocesador definir comandos. GDB admite constantes de matriz en expresiones introducidas por el usuario. La sintaxis es. . Por ejemplo, puede utilizar el comando print para crear una matriz en la memoria que se ha mallocado en el programa de destino. Debido a que C está tan extendido, la mayoría de las expresiones mostradas en los ejemplos de este manual están en C. Consulte la sección Uso de GDB con diferentes idiomas. Para obtener información sobre cómo utilizar expresiones en otros idiomas. En esta sección, discutimos los operadores que se pueden utilizar en expresiones GDB, independientemente de su lenguaje de programación. Casts son compatibles en todos los idiomas, no sólo en C, porque es tan útil para emitir un número en un puntero con el fin de examinar una estructura en esa dirección en la memoria. GDB soporta estos operadores, además de los comunes a los lenguajes de programación: es un operador binario para tratar partes de la memoria como arrays. Consulte la sección Arrays artificiales. para más información. :: permite especificar una variable en términos del archivo o función donde se define. Véase la sección Variables del programa. Addr Se refiere a un objeto del tipo de tipo almacenado en la dirección addr en la memoria. Addr puede ser cualquier expresión cuyo valor sea un entero o puntero (pero los paréntesis se requieren alrededor de operadores binarios, igual que en un molde). Esta construcción se permite independientemente de qué tipo de datos se supone normalmente residir en addr. 8.2 Variables del programa El tipo más común de expresión a utilizar es el nombre de una variable en su programa. Las variables en las expresiones se entienden en el marco de pila seleccionado (ver sección Selección de un marco) deben ser: globales (o archivos estáticos) visibles de acuerdo con las reglas de ámbito del lenguaje de programación desde el punto de ejecución en ese marco. En la función se puede examinar y utilizar la variable a cada vez que su programa se ejecuta dentro de la función foo. Pero sólo puede utilizar o examinar la variable b mientras el programa se ejecuta dentro del bloque donde se declara b. Hay una excepción: puede hacer referencia a una variable o función cuyo ámbito es un archivo de origen único, incluso si el punto de ejecución actual no está en este archivo. Pero es posible tener más de una variable o función con el mismo nombre (en diferentes archivos fuente). Si eso sucede, referirse a ese nombre tiene efectos impredecibles. Si lo desea, puede especificar una variable estática en una función o archivo en particular, utilizando la anotación de dos puntos y dos: Aquí el archivo o función es el nombre del contexto para la variable estática. En el caso de los nombres de archivo, puede utilizar comillas para asegurarse de que GDB analiza el nombre del archivo como una sola palabra; por ejemplo, para imprimir un valor global de x definido en f2.c. Este uso de :: está muy raramente en conflicto con el uso muy similar de la misma notación en C. GDB también admite el uso del operador de resolución de alcance C en expresiones GDB. Advertencia: Ocasionalmente, una variable local puede parecer que tiene el valor equivocado en ciertos puntos de una función - justo después de la entrada a un nuevo ámbito, y justo antes de salir. Es posible que vea este problema cuando esté siguiendo las instrucciones de la máquina. Esto se debe a que, en la mayoría de las máquinas, se necesitan más de una instrucción para configurar un marco de pila (incluidas las definiciones de variables locales) si se está pasando por instrucciones de máquina, las variables parecen tener valores incorrectos hasta que el marco de pila esté completamente construido. Al salir, usualmente también se necesita más de una instrucción de máquina para destruir un marco de pila después de comenzar a pasar por ese grupo de instrucciones, las definiciones de variables locales pueden haber desaparecido. Esto también puede ocurrir cuando el compilador realiza optimizaciones significativas. Para estar seguro de ver siempre valores precisos, desactive toda la optimización al compilar. Otro posible efecto de las optimizaciones del compilador es optimizar las variables no utilizadas fuera de existencia, o asignar variables a los registros (en contraposición a las direcciones de memoria). Dependiendo del soporte para estos casos ofrecidos por el formato de información de depuración utilizado por el compilador, GDB podría no ser capaz de mostrar valores para dichas variables locales. Si esto sucede, GDB imprimirá un mensaje como este: Para resolver estos problemas, recompile sin optimizaciones o utilice un formato de información de depuración diferente si el compilador admite varios de estos formatos. Por ejemplo, GCC, el compilador GNU C / C suele admitir la opción - gstabs. - gstabs produce información de depuración en un formato que es superior a los formatos como COFF. Puede ser capaz de utilizar DWARF2 (-gdwarf-2), que también es un formulario eficaz para información de depuración. Consulte la sección Opciones para depurar su programa o GNU CC en el uso de GNU CC. para más información. El operando izquierdo de debe residir en memoria. Los valores de matriz hechos de esta manera se comportan igual que otros arrays en términos de subíndice y se coaccionan a punteros cuando se usan en expresiones. Los arrays artificiales aparecen más a menudo en las expresiones a través del historial de valores (véase la sección Historial de valores), después de imprimir uno. Otra forma de crear una matriz artificial es usar un molde. Esto reinterpreta un valor como si fuera un array. El valor no necesita estar en la memoria: GDB calcula el tamaño para llenar el valor (como sizeof (value) / sizeof (tipo)). Array no es suficiente en las estructuras de datos moderadamente complejas, los elementos de interés pueden no ser realmente adyacentes - por ejemplo, si usted está interesado en los valores de los punteros en una matriz. Un trabajo útil alrededor de esta situación es utilizar Una variable de conveniencia (véase la sección Variables de conveniencia) como un contador en una expresión que imprima el primer valor interesante, y luego repetir esa expresión a través de RET. Por ejemplo, suponga que tiene una matriz dtab de punteros a las estructuras, y está interesado en el Valores de un campo fv en cada estructura. Aquí hay un ejemplo de lo que podría escribir: 8.4 Formatos de salida De forma predeterminada, GDB imprime un valor según su tipo de datos. A veces esto no es lo que desea. Imprimir un número en hexadecimal, o un puntero en decimal. O puede que desee ver los datos en la memoria en una dirección determinada como una cadena de caracteres o como una instrucción. Para hacer estas cosas, especifique un formato de salida al imprimir un valor. El uso más simple de los formatos de salida es decir cómo imprimir un valor ya calculado. Esto se hace iniciando los argumentos del comando de impresión con una barra diagonal y una letra de formato. Las letras de formato soportadas son: x Considere los bits del valor como un entero e imprima el entero en hexadecimal. D Imprimir como entero en decimal firmado. U Imprimir como entero en decimal sin signo. O Imprimir como entero en octal. T Imprimir como entero en binario. La letra t significa dos. (2) a Imprimir como una dirección, tanto absoluta en hexadecimal como como un desplazamiento del símbolo precedente más cercano. Puede utilizar este formato para descubrir dónde (en qué función) se encuentra una dirección desconocida: El símbolo de información de comando 0x54320 produce resultados similares. Vea el símbolo info de la sección. C Considerar como un entero e imprimirlo como una constante de carácter. F Considere los bits del valor como un número de punto flotante e imprima utilizando la sintaxis típica de coma flotante. Por ejemplo, para imprimir el contador de programas en hexadecimal (vea la sección 8.10 Registros), escriba Note que no es necesario espacio antes de la barra porque los nombres de comandos en GDB no pueden contener una barra diagonal. Para volver a imprimir el último valor en el historial de valores con un formato diferente, puede utilizar el comando print con sólo un formato y sin expresión. Por ejemplo, p / x reimprime el último valor en hexadecimal. 8.5 Examinar la memoria Puede utilizar el comando x (para examinar) para examinar la memoria en cualquiera de varios formatos, independientemente de los tipos de datos de los programas. X / nfu addr x addr x Utilice el comando x para examinar la memoria. norte. F. Y u son todos los parámetros opcionales que especifican la cantidad de memoria que se va a mostrar y cómo darle formato addr es una expresión que da la dirección donde desea iniciar la visualización de la memoria. Si utiliza valores predeterminados para nfu. No es necesario escribir la barra /. Varios comandos establecen los valores predeterminados convenientes para addr. norte. El recuento de repetición El recuento de repetición es un entero decimal el valor predeterminado es 1. Especifica la cantidad de memoria (contando por unidades u) para mostrar. F. El formato de visualización El formato de visualización es uno de los formatos utilizados por la impresión. S (cadena con terminación nula) o i (instrucción de máquina). El valor predeterminado es x (hexadecimal) inicialmente. El valor predeterminado cambia cada vez que utiliza x o imprime. U El tamaño de la unidad El tamaño de la unidad es cualquiera de b Bytes. H Halfwords (dos bytes). W Palabras (cuatro bytes). Este es el valor predeterminado inicial. G Palabras gigantes (ocho bytes). Cada vez que especifique un tamaño de unidad con x. Ese tamaño se convierte en la unidad predeterminada la próxima vez que utilice x. (Para los formatos s e i, el tamaño de la unidad se ignora y normalmente no se escribe.) Addr. Dirección de inicio display addr es la dirección donde desea que GDB comience a mostrar la memoria. La expresión no necesita tener un valor de puntero (aunque puede) siempre se interpreta como una dirección entera de un byte de memoria. Véase la sección Expresiones. Para más información sobre expresiones. El valor predeterminado para addr suele ser justo después de la última dirección examinada, pero varios otros comandos también establecen la dirección predeterminada: puntos de interrupción de información (a la dirección del último punto de interrupción enumerado), línea de información (a la dirección inicial de una línea) y Print (si lo usa para mostrar un valor de la memoria). Por ejemplo, x / 3uh 0x54320 es una solicitud para mostrar tres halfwords (h) de memoria, formateado como enteros decimales no firmados (u), comenzando en la dirección 0x54320. X / 4xw sp imprime las cuatro palabras (w) de la memoria por encima del puntero de la pila (aquí, sp ver sección Registros) en hexadecimal (x). Dado que las letras que indican los tamaños de las unidades son todas distintas de las letras que especifican los formatos de salida, no es necesario recordar si el tamaño o el formato de la unidad es el primero. Las especificaciones de salida 4xw y 4wx significan exactamente lo mismo. (Sin embargo, el contador n debe venir primero wx4 no funciona.) A pesar de que el tamaño de unidad u se ignora para los formatos s e i. Puede que quiera usar un contador n por ejemplo, 3i especifica que desea ver tres instrucciones de máquina, incluyendo cualquier operando. El comando desarmar proporciona una forma alternativa de inspeccionar las instrucciones de la máquina, véase Fuente y código de máquina. Todos los valores predeterminados para los argumentos de x están diseñados para que sea fácil continuar explorando la memoria con especificaciones mínimas cada vez que utilice x. Por ejemplo, después de haber inspeccionado tres instrucciones de la máquina con x / 3i addr. Puede inspeccionar los siguientes siete con sólo x / 7. Si utiliza RET para repetir el comando x, el número de repetición n se utiliza de nuevo, los otros argumentos predeterminados como para usos sucesivos de x. Las direcciones y el contenido impreso por el comando x no se guardan en el historial de valores, ya que a menudo son demasiados y se interponen en el camino. En su lugar, GDB hace que estos valores estén disponibles para uso posterior en expresiones como valores de las variables de conveniencia y. Después de un comando x, la última dirección examinada está disponible para su uso en expresiones en la variable de conveniencia. El contenido de esa dirección, tal como se examina, está disponible en la variable de conveniencia. Si la orden x tiene un recuento de repetición, la dirección y el contenido guardados son de la última unidad de memoria impresa, esto no es lo mismo que la última dirección impresa si se imprimieron varias unidades en la última línea de salida. 8.6 Visualización automática Si considera que desea imprimir el valor de una expresión con frecuencia (para ver cómo cambia), puede agregarla a la lista de visualización automática para que GDB imprima su valor cada vez que se detenga el programa. Cada expresión agregada a la lista recibe un número para identificarlo para eliminar una expresión de la lista, se especifica ese número. La pantalla automática tiene este aspecto: Esta pantalla muestra los números de los artículos, las expresiones y sus valores actuales. Al igual que con las pantallas que solicita manualmente utilizando x o imprimir. Usted puede especificar el formato de salida que prefiera de hecho, la pantalla decide si desea utilizar la impresión o x dependiendo de cómo elaborar su especificación de formato es - que utiliza x si se especifica un tamaño de unidad, o uno de los dos formatos (iy s) Que son soportados solamente por x de otra manera él utiliza la impresión. Display expr Agrega la expresión expr a la lista de expresiones que se mostrarán cada vez que se detenga el programa. Véase la sección Expresiones. La pantalla no se repite si vuelve a pulsar RET después de usarla. Display / fmt expr Para fmt especificando sólo un formato de visualización y no un tamaño o recuento, añada la expresión expr a la lista de visualización automática, pero dispóngalo para mostrarla cada vez en el formato especificado fmt. Consulte la sección Formatos de salida. Display / fmt addr Para fmt i o s. O incluir un tamaño de unidad o un número de unidades, agregue la expresión addr como una dirección de memoria que se examinará cada vez que su programa se detenga. Examinar significa en efecto hacer x / fmt addr. Véase la sección Examinar la memoria. Por ejemplo, mostrar / i pc puede ser útil, para ver la instrucción de la máquina a punto de ejecutarse cada vez que se detiene la ejecución (pc es un nombre común para el contador de programas, véase la sección Registros). Undisplay dnums Eliminar los dnums de visualización. Eliminar los números de elemento dnums de la lista de expresiones que se mostrarán. La reproducción no se repetirá si pulsa RET después de usarla. (De lo contrario, sólo obtendría el error Sin número de visualización.) Deshabilitar dnums de visualización. Deshabilitar la visualización de los números de artículo dnums. Un elemento de visualización deshabilitado no se imprime automáticamente, pero no se olvida. Puede ser habilitado de nuevo más tarde. Habilitar dnums de visualización. Habilitar la visualización de los números de artículo dnums. Se vuelve eficaz una vez más en la exhibición automática de su expresión, hasta que usted especifique de otra manera. Display Muestra los valores actuales de las expresiones de la lista, tal como se hace cuando el programa se detiene. Visualización de información Permite imprimir la lista de expresiones previamente configuradas para que se muestren automáticamente, cada una con su número de artículo, pero sin mostrar los valores. Esto incluye las expresiones deshabilitadas, que están marcadas como tales. También incluye expresiones que no se mostrarían ahora porque se refieren a variables automáticas no disponibles actualmente. Si una expresión de visualización se refiere a variables locales, entonces no tiene sentido fuera del contexto léxico para el cual fue configurado. Dicha expresión se desactiva cuando la ejecución entra en un contexto en el que una de sus variables no está definida. Por ejemplo, si da el comando mostrar lastchar mientras está dentro de una función con un argumento lastchar. GDB muestra este argumento mientras el programa continúa deteniéndose dentro de esa función. Cuando se detiene en otro lugar - donde no hay ninguna variable lastchar --- la pantalla se deshabilita automáticamente. La próxima vez que el programa se detenga donde lastchar es significativo, puede activar la expresión de visualización una vez más. Puede utilizar la dirección de impresión establecida desactivada para eliminar todas las pantallas dependientes de la máquina de la interfaz GDB. Por ejemplo, con la dirección de impresión desactivada. Usted debe conseguir el mismo texto para backtraces en todas las máquinas - si o no implican argumentos del puntero. Mostrar dirección de impresión Muestra si se deben imprimir o no direcciones. Cuando GDB imprime una dirección simbólica, normalmente imprime el símbolo anterior más cercano más un desplazamiento. Si ese símbolo no identifica únicamente la dirección (por ejemplo, es un nombre cuyo ámbito es un archivo de origen único), puede que tenga que aclarar. Una forma de hacerlo es con la línea de información. Por ejemplo línea de información 0x4537. Alternativamente, puede configurar GDB para imprimir el archivo de origen y el número de línea cuando imprima una dirección simbólica: configure el símbolo de impresión-nombre de archivo en Tell GDB para imprimir el nombre del archivo fuente y el número de línea de un símbolo en la forma simbólica de una dirección. Set print symbol-filename off No imprime el nombre del archivo fuente y el número de línea de un símbolo. Este es el valor predeterminado. Show print symbol-filename Muestra si GDB imprimirá o no el nombre del archivo fuente y el número de línea de un símbolo en la forma simbólica de una dirección. Otra situación en la que resulta útil mostrar nombres de ficheros y números de línea de símbolos es cuando se desmonta el código GDB que muestra el número de línea y el archivo de origen que corresponde a cada instrucción. También puede que desee ver el formulario simbólico sólo si la dirección que se está imprimiendo está razonablemente cerca del símbolo anterior más cercano: set print max-symbolic-offset max-offset Indica a GDB que sólo muestre la forma simbólica de una dirección si el desplazamiento entre El símbolo anterior más cercano y la dirección es menor que el desplazamiento máximo. El valor predeterminado es 0, que le indica a GDB que siempre imprima la forma simbólica de una dirección si algún símbolo la precede. Show print max-symbolic-offset Pregunte cuán grande es el offset máximo que GDB imprime en una dirección simbólica. Si tiene un puntero y no está seguro de dónde apunta, pruebe a establecer el símbolo de impresión-nombre de archivo. A continuación, puede determinar el nombre y la ubicación del archivo fuente de la variable donde apunta, utilizando el puntero p / a. Esto interpreta la dirección en forma simbólica. Por ejemplo, aquí GDB muestra que una variable ptt apunta a otra variable t. Definido en hi2.c. Advertencia: para los punteros que apuntan a una variable local, p / a no muestra el nombre del símbolo y el nombre de archivo del referente, incluso con las opciones de impresión de conjunto adecuadas activadas. Otras configuraciones controlan la forma en que se imprimen diferentes tipos de objetos: set print array set print array en Pretty arrays de impresión. Este formato es más conveniente de leer, pero usa más espacio. El valor predeterminado está desactivado. Set print array off Vuelve al formato comprimido para arrays. Show print array Muestra si el formato comprimido o bonito está seleccionado para mostrar matrices. Conjunto de elementos de impresión número de elementos Establezca un límite en el número de elementos de una matriz que GDB imprimirá. Si GDB está imprimiendo una matriz grande, detiene la impresión después de haber impreso el número de elementos establecidos por el comando set print elements. Este límite también se aplica a la visualización de cadenas. Cuando se inicia GDB, este límite se establece en 200. El ajuste de número de elementos a cero significa que la impresión es ilimitada. Mostrar elementos de impresión Muestra el número de elementos de una matriz grande que GDB imprimirá. Si el número es 0, la impresión es ilimitada. Set print null-stop Causa GDB para detener la impresión de los caracteres de una matriz cuando se encuentra el primer NULL. Esto es útil cuando las matrices grandes contienen realmente sólo cadenas cortas. El valor predeterminado está desactivado. . . . .


No comments:

Post a Comment