¿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
Respuesta
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
Es posible tener una versión no eliminada o una versión de depuración depurada. – leander
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. –
no es verdad, los símbolos de extracción son independientes de las versiones de depuración o versión –
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.
Ser vinculado contra msvcrtD no es lo mismo que tener información de depuración ... –
@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
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. –
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
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. –
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 :)
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.
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. –
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)
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 –
Simplemente comprobando, ¿llama a printf en hello.c? –
Actally estaba usando puts –
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.
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
- 1. Java, Runtime.exec o ProcessBuilder: cómo saber si el archivo es shell o binario?
- 2. ¿Comprueba si un archivo es binario o ASCII con Node.js?
- 3. Depuración de depuración o lanzamiento del informe?
- 4. ¿Cómo comprobar si el archivo es binario?
- 5. linux + verificar si el archivo es de texto o binario
- 6. ¿Existe un serializador binario en WIN RT?
- 7. ¿Cómo saber si NSAssert está deshabilitado en versiones de lanzamiento?
- 8. ¿Cómo saber si un manejador de archivo es un socket?
- 9. Archivo simple con versiones de lanzamiento y depuración - Mejores prácticas
- 10. ¿Cómo saber si un archivo es un enlace?
- 11. saber si .lib es estático o importar
- 12. ¿Cómo puedo saber si un MotionEvent es relativo o absoluto?
- 13. ¿Cómo saber si un archivo es un EXE o un DLL?
- 14. ¿Cómo saber si un modelo es nuevo o no?
- 15. ¿Cómo puedo saber si una ruta determinada es un directorio o un archivo? (C/C++)
- 16. depuración vs lanzamiento en CMAKE
- 17. Cómo verificar si el archivo es ASCII o binario en PHP
- 18. Símbolos de depuración en modo de lanzamiento
- 19. cómo saber si el registro binario de mysql es habilitado a través del comando sql?
- 20. cómo saber si una cadena es base64 o no
- 21. cómo comprobar si el archivo pdb es válido para la depuración de un conjunto
- 22. ¿Cómo saber si existe un archivo en C#/.NET?
- 23. ¿Cómo puedes saber cuál es la actividad de lanzamiento principal?
- 24. Depuración en .NET en modo de lanzamiento
- 25. Cómo saber si el archivo de base de datos sqlite es válido o no
- 26. Visual Studio: información de depuración en la compilación de lanzamiento
- 27. ¿Cómo puedo saber si una impresora imprimirá en un archivo?
- 28. ¿Cómo puedo verificar si un binario compilado es de 32 bits o de 64 bits?
- 29. Ruby: Cómo determinar si el archivo que se lee es binario o texto
- 30. ¿Cómo saber si un objeto es un número entero o una cadena o isa booleano?
¿Para qué idiomas? ¿Para qué formatos de depuración? –
"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
* ¿Quiere decir si algo se compiló con símbolos de depuración y se dejó sin eliminar? * Sí. –