2011-06-25 9 views
8
'_<perlmain.c' => *{'::_<perlmain.c'}, 
'_</usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/Data/Dumper/Dumper.so' => *{'::_</usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/Data/Dumper/Dumper.so'}, 
'_<universal.c' => *{'::_<universal.c'}, 
'_<xsutils.c' => *{'::_<xsutils.c'}, 
... 

¿Por qué están en la tabla de símbolos de %main::, cuando son útiles?¿Por qué hay varios archivos c en la tabla de símbolos de% main ::?

+0

Aquellos parecen ser archivos que definen símbolos de Perl. (por ejemplo, 'universal.c' crea' & utf8 :: upgrade'). – ikegami

Respuesta

1

Como perl es un lenguaje basado en el intérprete, necesita, a la derecha, su intérprete, el binario perl. Este binario solo lee el script de Perl, y ejecuta el código traduciéndolo en código de máquina.

Su intérprete perl está compilado con símbolos de depuración, por lo que contiene información sobre los archivos fuente de los que se construye. También puede ver los objetos de los módulos cargados Data::Dumper en su ejemplo.

Espero que ayude

+0

no exactamente, el intérprete de Perl tiene cientos de archivos fuente, ¿por qué solo se enumeran los anteriores? –

+0

porque, solo las fuentes que se muestran tienen que hacer algo con el código ejecutado. Intenta usar más funciones y módulos, y verás más referencias. –

2

Para repetir la salida de la cuestión, ejecute

#! /usr/bin/env perl 
use Data::Dumper; 
print Dumper \%main::; 

Las entradas que se ve se inserta en gv_fetchfile_flags:

/* This is where the debuggers %{"::_<$filename"} hash is created */ 
tmpbuf[0] = '_'; 
tmpbuf[1] = '<'; 
memcpy(tmpbuf + 2, name, namelen); 
gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE); 
if (!isGV(gv)) { 
    gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE); 
#ifdef PERL_DONT_CREATE_GVSV 
    GvSV(gv) = newSVpvn(name, namelen); 
#else 
    sv_setpvn(GvSV(gv), name, namelen); 
#endif 
} 

esto se le llama muchas veces por camino de newXS como parte del boot process in S_parse_body.

boot_core_PerlIO(); 
boot_core_UNIVERSAL(); 
boot_core_mro(); 

Tenga en cuenta que también se puede ver entradas para perlio.c, universal.c y mro.c en la salida.

La sección Debugger Internals del perldebguts documentation explica su uso:

Por ejemplo, cada vez que se llama a Perl incorporado en función de la persona que llama desde el paquete DB, los argumentos de que el marco de pila correspondiente fue llamado con se copian la matriz @DB::args. Estos mecanismos se habilitan llamando a Perl con el interruptor -d. Específicamente, las siguientes características adicionales están habilitadas (cf. $^P en perlvar):

  • ...
  • Cada matriz @{"_<$filename"} mantiene las líneas de $filename para un archivo compilado por Perl. Lo mismo también es cierto para las cadenas evaladas que contienen subrutinas, o que se están ejecutando actualmente. El $filename para cuerdas evaladas se ve como (eval 34). Las aserciones de código en expresiones regulares se parecen al (re_eval 19).
  • Cada hash %{"_<$filename"} contiene puntos de corte y acciones marcadas por número de línea. Las entradas individuales (a diferencia del hash completo) son configurables. A Perl solo le importa el booleano verdadero aquí, aunque los valores utilizados por perl5db.pl tienen el formato "$break_condition\0$action".
    Lo mismo se aplica a las cadenas evaluadas que contienen subrutinas o que se están ejecutando actualmente. El $ nombre de archivo para cuerdas evaladas se parece a (eval 34) o (re_eval 19).
  • Cada escalar ${"_<$filename"} contiene "_<$filename". Este es también el caso de las cadenas evaluadas que contienen subrutinas, o que se están ejecutando actualmente. El $filename para cuerdas evaladas se ve como (eval 34) o (re_eval 19).
  • Después de compilar cada archivo requerido, pero antes de que se ejecute, se llama a DB::postponed(*{"_<$filename"}) si existe la subrutina DB::postponed. Aquí, el $filename es el nombre expandido del archivo requerido, como se encuentra en los valores de %INC.
  • ...
+0

Respuesta muy completa, pero no olvide, que los símbolos se cargan siempre, solo lo ve en modo de depuración. Y hay más símbolos descritos aquí, solo por completitud. –

Cuestiones relacionadas