2011-05-12 17 views
12

mi programa procesa grandes errores y durante el desarrollo genera una gran cantidad de salida en la consola. Sufre de daños en la memoria e intento usar valgrind para localizar el error.Hacer detener valgrind inmediatamente después del primer error

Desafortunadamente, no puedo encontrar los mensajes de error entre las líneas de salida, y se vacían demasiado rápido para cancelar la ejecución cuando aparecen. Deben estar allí para localizar el error (qué elemento causa el error, etc.). Redirigir luego dentro de mi programa no funciona, al igual que la tubería, la salida solo redirige la salida del programa, no la salida de valgrind.

¿Puede darme una pista sobre cómo solucionar esto?

Respuesta

1

Puede pedir valgrind para salvar su salida en un archivo:

valgrind --log-file=<filename> 

donde <filename> es el nombre del archivo para la salida. Más tarde puede ver este archivo con less o editor de texto.

+1

Esto "desconecta" la salida de VG de la salida del programa, que OP reclamó es necesaria para saber qué datos estaba procesando el programa en el momento de VG error. –

3

Valgrind da salida a stderr (fd 2) de manera predeterminada. Puede capturar stderr mediante la reorientación de archivo desctiptor 2:

# Output to log file. 
valgrind [options] > valgrind.log 2>&1 

# View output interactively. 
valgrind [options] 2>&1 | less 

o puede utilizar la opción --log-fd a cambiar el lugar donde se envía de salida:

valgrind [options] --log-fd=1 > valgrind.log 
valgrind [options] --log-fd=1 | less 
20

Además de redireccionar tanto el programa como la salida de Valgrind a un archivo (como ya se sugirió), puede usar el indicador --db-attach=yes, lo que provocará que su programa se detenga en el depurador justo en el error.

Esto tiene la ventaja de que, además de mirar el registro que produjo su programa, también puede ver otro estado del programa (que no está registrando).

+0

Super útil flag: nunca supe esto en mis años de uso de gdb. ¡Gracias! – KarateSnowMachine

+3

Veo que eliminaron esta opción en la última valgrind. Fue increíblemente útil y me cuesta trabajo depurar sin él, ¿conoce una alternativa? – asutherland

+0

Sí, use '--vgdb-error = 0' en su lugar, y siga las instrucciones. – user894763

7

Si desea que se detenga en la consola (no en un archivo), aquí es una manera de hacerlo:

Utilice el parámetro: --gen-suppressions=yes

Al depurar lo hará paradas como este:

==949== Thread 2: 
==949== Invalid read of size 4 
==949== at 0x7B62DC0: wcslen (wcslen.S:24) 
==949== by 0x7B62D7D: wcsdup (wcsdup.c:29) 
==949== by 0x52D0476: de_strdup(wchar_t*) (de_string.cpp:1442) 
==949== by 0x437629: void de_format<>(c_de_string&, wchar_t*) (de_string.h:368) 
==949== by 0x45F4FB: int db_select_group<>(s_db*, s_pqexec_param*, wchar_t*, wchar_t*, wchar_t*, wchar_t*, int, wchar_t*) (in /corto/goinfre/code2/cortod.repo/bin/x64/Debug/cortod) 
==949== by 0x45EA96: check_oldgeom(c_cartod*) (cartod_funcs.cpp:114) 
==949== by 0x45EBF8: armserv_update_geom(c_cartod*) (cartod_funcs.cpp:149) 
==949== by 0x455EF9: c_cortosrv_thread::on_timeout() (cartod.cpp:163) 
==949== by 0x52FE500: c_de_thread::loop() (de_thread.cpp:35) 
==949== by 0x52FEE97: thread_loop(void*) (de_thread_priv_linux.cpp:85) 
==949== by 0x506E181: start_thread (pthread_create.c:312) 
==949== by 0x7BBA47C: clone (clone.S:111) 
==949== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==949== 
==949== 
==949== ---- Print suppression ? --- [Return/N/n/Y/y/C/c] ---- 

entonces usted puede ir a la siguiente continuará toda etc.

el propósito normal de este parámetro es para eliminar los falsos positivos, por printi ng supresión que puede agregar en un archivo y pasarlo a valgrind usando el parámetro: --suppressions=<filename>

+0

Gracias. Eso es lo que estaba buscando :) – ben

Cuestiones relacionadas