2009-04-30 18 views
31

¿Hay una utilidad de línea de comandos simple para inspeccionar binarios como bibliotecas ejecutables y dinámicas para saber si son versiones de lanzamiento o de depuración? ¿Hay algo así en * nix o windows?Cómo saber si un archivo binario es de lanzamiento o depuración en win y * nix

+1

¿Para qué idiomas? ¿Para qué formatos de depuración? –

+4

"Depurar" y "Liberar" no tienen significados específicos; son solo formas de referirse a un conjunto de opciones, que podrían ser diferentes en diferentes proyectos. ¿Quiere decir si algo se compiló con símbolos de depuración y se dejó sin eliminar? – smorgan

+1

* ¿Quiere decir si algo se compiló con símbolos de depuración y se dejó sin eliminar? * Sí. –

Respuesta

16

En Linux puede usar el comando "file" incluso para bibliotecas dinámicas. Si dice "pelado", se eliminan todos los símbolos de depuración. Si está diciendo "no eliminado", es lo opuesto

+13

Es posible tener una versión no eliminada o una versión de depuración depurada. – leander

+0

No estoy seguro de lo que quiere decir con versión o versión de depuración. Supuse que un programa/biblioteca se compilaría con símbolos de depuración para la depuración y se eliminará para su envío. Por lo tanto, la depuración o la versión están implícitas en la forma en que la usa. Puede tener todas las combinaciones, ya que depende de cómo lo empaquete. –

+6

no es verdad, los símbolos de extracción son independientes de las versiones de depuración o versión –

3

Para Windows, el Dependency Walker tiene una salida de línea cmd opcional que enumera cada dll que carga el exe (y sus dependencias). Ejecuta eso a través de grep y mira si msvcrt-dll emerge con d o no.

Esto solo funciona si está vinculado dinámicamente. De lo contrario, podría ser más complicado.

Quizás pueda grep para ciertas funciones que son diferentes en depurar/liberar, si esas cadenas son visibles en el ejecutable.

Si sus aplicaciones no usan el tiempo de ejecución, sería bastante complicado.

+0

Ser vinculado contra msvcrtD no es lo mismo que tener información de depuración ... –

+0

@Andre Tener información de depuración no es lo mismo que estar integrado en la depuración o liberación. ¿Qué quieres decir? – Macke

+0

Vea los comentarios de leander y smorgan anteriores. Es posible tener una compilación de versión no eliminada, pero también eliminar una compilación de depuración. La distinción "Debug" vs "Release" es un poco vaga. Para algunas personas, p. usted "Depurar" significa: construido contra el tiempo de ejecución de depuración. Para otros, puede significar "construido sin definir el NDEBUG." Y para otros puede significar: no optimizado o simplemente: con símbolos de depuración. –

2

No hay mucho para seguir. Si abre un conjunto en el reflector, se puede buscar la Asamblea Atributo:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)] 

Pero al parecer, que se agrega a modo de liberar también.

Si se trata de su propio ensamblaje, la solución es utilizar algunas directivas de preprocesador.

#ifdef DEBUG 
[MyAttribute("foo")] 
#endif 

editar: Lo siento, asumí .NET. Ahí va mi martillo

+2

Me alegro de que haya asumido .NET porque eso es lo que me trajo aquí y su respuesta me indicó el dirección correcta. En VS2010, el atributo está en las versiones Depurar y Versión, pero el argumento "lista" es diferente. –

2

La mayoría de las versiones de depuración tanto de ejecutables como de bibliotecas están vinculadas con la versión de depuración del tiempo de ejecución. En Windows hay un esquema de nombres para las versiones de depuración/versión que algunos siguen, entre ellos MS. El nombre de la versión de depuración de una biblioteca debe terminar con d. Puede usar una herramienta como Dependency Walker (http://www.dependencywalker.com) para ver de qué bibliotecas depende su ejecutable o biblioteca. Si encuentra versiones de depuración de bibliotecas en tiempo de ejecución existe una gran posibilidad de que su ejecutable o biblioteca se haya construido en modo de depuración.

Sin embargo, esto sólo funciona si

  • se puede decir mirando a un nombre de tiempo de ejecución qué versión es (que sigue algún esquema de nombres como el que he descrito más arriba)
  • su ejecutable/library está vinculado contra el tiempo de ejecución dinámico no estático uno. En el segundo caso, el tiempo de ejecución se detuvo en ejecutable/biblioteca y ya no es una dependencia
  • está en Windows :)
3

para UNIX: con ejecutables ELF puede ser capaz de utilizar objdump o nm para ver las tablas de símbolos para el ejecutable (tenga en cuenta que esto funcionará mucho mejor si no se elimina).La presencia o ausencia de ciertos símbolos tenderá a indicar una creación de depuración o liberación. (En cuanto a eso, eso probablemente depende de qué bibliotecas estés usando, etc. Tendrás que buscar un poco para encontrar las más comunes, siéntete libre de sugerir cosas que buscar en los comentarios, y actualizaré el respuesta.)

Para Windows: las sugerencias de dependencywalker son buenas. Para los equivalentes de línea de comandos, puede encontrar dumpbin en la mayoría de las instalaciones de Visual Studio y es algo equivalente a objdump en * nix. También puede encontrar un nm u objdump en, por ejemplo, msys o cygwin que funcionarán en algunos archivos de Windows exe.

+0

Soy nuevo en Mac OS X, que es lo que estoy usando. Pero aparentemente objdump no viene con Xcode. nm está disponible pero la única diferencia que puedo ver es que la versión de depuración simplemente contiene muchas más cosas. –

28
  • para C++ en Linux , que puede hacer:

    objdump --source yourbin |grep printf 
    

    Reemplazar printf con cualquier función de llamada que haces. Si es depuración, mostrará todas las llamadas al código fuente real que realice. Si es versión, solo mostrará el símbolo fundado de la tabla de símbolos.

  • para C++ en de Windows, puede utilizar depends.exe y ver si depende de MSVCRT (liberación) o MSVCRTD (depuración)

+0

No estoy seguro si esto funciona 'objdump --source hello32 * | grep printf' en este' gcc -m32 -g -o hello32_dbg hello.c 'y este caso' gcc -m32 -o hello32 hello.c' no devuelve nada –

+0

Simplemente comprobando, ¿llama a printf en hello.c? –

+0

Actally estaba usando puts –

0

Puede utilizar Filever.exe.

filever.exe <my binary file> 
--a-- W32i APP -   1.0.0.0 shp  25,600 11-03-2013 <my file> 

Para obtener el archivo, puede descargar las herramientas de soporte para Windows XP.

Si se mudó a Windows 7 o superior (como la mayoría de los usuarios de Windows), puede descargarlo, abrirlo a través de winzip.

A continuación, extraiga filever de support.cab.

Funciona perfectamente para Windows 7.

0

Utilice depends.exe para averiguar de qué versión se trata. cuando abres el archivo a través de depend walker, mostrará el archivo que se necesita. Al ver la lista de archivos system32, puede si se trata de depuración o versión

Cuestiones relacionadas