2010-03-02 6 views
5

Uno de mis problemas con el código Perl (en línea de comandos debbugger, perl -d) es el hecho de que al imprimir erróneamente (a través del comando x) el contenido de una enorme estructura de datos se congela su terminal para siempre y media mientras se imprimen cientos de páginas de datos. Especialmente si eso ocurre en una red lenta.Limitando la cantidad de información impresa por el depurador Perl

Como tal, me gustaría poder limitar la cantidad de datos que imprime x.

Veo dos enfoques: estaría dispuesto a probar si alguien sabe cómo hacerlo.

  1. Limita la cantidad de datos que cualquier comando en las impresiones del depurador.

  2. Mejor aún, reemplace de algún modo el comando x incorporado con un método personalizado de Perl (que calcularía el "tamaño" de la estructura de datos, y se niega a imprimir su contenido sin confirmación).

estoy pidiendo específicamente "cómo sustituir x con código personalizado" - la construcción de una suficientemente bueno "es la estructura de datos demasiado grande" método de Perl es algo que probablemente puedo hacer por mi cuenta, sin demasiado esfuerzo, aunque Veo suficientes trampas que impiden que el "perfecto" sea un esfuerzo bastante frustrante. Diablos, simplemente haciendo Data :: Dumper-> Dump y tomando la longitud de la cadena podría hacer el truco :)

Tenga en cuenta que soy perfectamente consciente de cómo evitar manualmente el problema mediante el examen recursivo de las capas de la estructura de datos (por ejemplo, imprimir la referencia, imprimir el recuento de teclas/elementos de matriz, etc.) ... el punto es que quiero evitar escribir sin pensar x $huge_pile_of_data sin pensar, o tropezar con un error que puebla esa enorme pila de datos en lo que debería ser un escalar.

+0

menudo utilizo el enfoque simple menciona en su pregunta, la adición de dicho ciclo, código que estoy de depuración: 'sub xx {uso de datos :: Dumper; imprimir Dumper (@_)} '. Luego uso 'xx $ foo' dentro del depurador en lugar de' x $ foo'. Como dices, una persona podría hacer 'xx()' más servicio completo al verificar la longitud antes de imprimir. – FMc

+0

@FM - pero esto supone que tienes la previsión de saber que $ foo es grande. Todo mi problema es hacer esto por accidente. – DVK

+0

Lo que estoy sugiriendo no requiere que presumas nada sobre '$ foo'. Más bien, requiere un cambio en el hábito: use 'xx' todo el tiempo, en lugar de' x', principalmente porque la salida de 'Data :: Dumper' es mejor que la salida de' x', pero también porque usa su su propia subrutina de descarga facilita la personalización del comportamiento según lo requiera el problema en cuestión. Solo una idea, por supuesto. – FMc

Respuesta

8

El comando | en el depurador canaliza la salida de otro comando a su buscapersonas, p.

 DB<1> |x %huge_datastructure
11

El comando x toma un argumento opcional para la profundidad máxima que se mostrará. Eso no es lo mismo que limitar la cantidad de datos a N páginas, pero definitivamente es útil para evitar sobrecargas.

DB<1> %h = (a => { b => { c => 1 } }) 

    DB<2> x %h 
0 'a' 
1 HASH(0x1d5ff44) 
    'b' => HASH(0x1d61424) 
     'c' => 1 

    DB<3> x 2 %h 
0 'a' 
1 HASH(0x1d5ff44) 
    'b' => HASH(0x1d61424) 

Puede especificar la profundidad predeterminada para imprimir a través del comando o, por ejemplo,

DB<1>o dumpDepth=1 

añadir que a su archivo .perldb aplicarlo a todas las sesiones del depurador.

De lo contrario, parece que el comando x invoca DB::dumpit() que es sólo un envoltorio para dumpval.pl (o, más específicamente, la main::dumpValue() sub define). Puede modificar/reemplazar ese script como mejor le parezca. Aunque no estoy seguro de cómo lo harías interactivo.

Cuestiones relacionadas