I've been wanting this little enhancement for quite some time.
I finally coded it up.
Suggestions welcome.
Kevin
The patch updates disassemble output to contain three useful pieces of
information.
FROM
load_bytecode_sc "TGE.pbc"
find_type_i_sc I0,"ASTGrammar"
ne_i_ic_ic I0,0,L1
subclass_p_sc_sc P0,"TGE::Grammar","ASTGrammar"
L1: set_returns_pc PMC_CONST(5)
returncc
get_params_pc PMC_CONST(14)
debug_init
defined_i_p_kc I0,P1[?]
unless_i_ic I0,L2
set_p_p_kc P1,P1[?]
set_args_pc PMC_CONST(19)
get_results_pc PMC_CONST(17)
callmethodcc_p_sc P3,"get"
set_returns_pc PMC_CONST(17)
returncc
L2: print_sc "The top-level node d"
end
get_params_pc PMC_CONST(14)
defined_i_p_kc I0,P1[?]
unless_i_ic I0,L3
set_p_p_kc P1,P1[?]
set_args_pc PMC_CONST(19)
get_results_pc PMC_CONST(17)
callmethodcc_p_sc P3,"get"
set_returns_pc PMC_CONST(17)
returncc
L3: print_sc "The compound_stateme"
end
TO
Seq_Op_Num- Relative-PC SrcLn#:
Current Source Filename src/ASTGrammar_gen.pir
000000000000-000000000000 000025: load_bytecode_sc "TGE.pbc"
000000000001-000000000002 000026: find_type_i_sc I0,"ASTGrammar"
000000000002-000000000005 000026: ne_i_ic_ic I0,0,L1
000000000003-000000000009 000028: subclass_p_sc_sc
P0,"TGE::Grammar","ASTGrammar"
000000000004-000000000013 000029: L1: set_returns_pc PMC_CONST(5)
000000000005-000000000015 000029: returncc
Current Source Filename src/ASTGrammar_gen.pir
000000000006-000000000016 000034: get_params_pc PMC_CONST(14)
000000000007-000000000021 000038: debug_init
000000000008-000000000022 000042: defined_i_p_kc I0,P1[?]
000000000009-000000000026 000042: unless_i_ic I0,L2
000000000010-000000000029 000043: set_p_p_kc P1,P1[?]
000000000011-000000000033 000045: set_args_pc PMC_CONST(19)
000000000012-000000000039 000045: get_results_pc PMC_CONST(17)
000000000013-000000000042 000045: callmethodcc_p_sc P3,"get"
000000000014-000000000045 000047: set_returns_pc PMC_CONST(17)
000000000015-000000000048 000047: returncc
000000000016-000000000049 000050: L2: print_sc "The top-level
node d"
000000000017-000000000051 000051: end
Current Source Filename src/ASTGrammar_gen.pir
000000000018-000000000052 000056: get_params_pc PMC_CONST(14)
000000000019-000000000057 000062: defined_i_p_kc I0,P1[?]
000000000020-000000000061 000062: unless_i_ic I0,L3
000000000021-000000000064 000063: set_p_p_kc P1,P1[?]
000000000022-000000000068 000065: set_args_pc PMC_CONST(19)
000000000023-000000000074 000065: get_results_pc PMC_CONST(17)
000000000024-000000000077 000065: callmethodcc_p_sc P3,"get"
000000000025-000000000080 000067: set_returns_pc PMC_CONST(17)
000000000026-000000000083 000067: returncc
000000000027-000000000084 000070: L3: print_sc "The
compound_stateme"
000000000028-000000000086 000071: end
Seq_Op_Num this is a sequential op number for each operation in the
code segment.
(The debug segment indexes both debug mappings and line numbers based on
this incrementing counter)
Relative-PC this is the op_code_t offset of the operation in the code
segement.
SrcLn# is the line number of the pir source code. (in this case
src/AST_Grammar_gen.pir)
When chasing PIR bugs and parrot segfauts. Run parrot in gdb.
cat > .rit_gdb_cmds <<EOF
set args cardinal.pbc t/00_if_unless_5.rb
run
set print pretty
EOF
gdb -x .rit_gdb_cmds ../../parrot
Find the runops_slow_core activation frame closes to the top of the
stack and execute these commands in gdb
(gdb) p interpreter->code->base.name
$48 = 0x82c23c8 "BYTECODE_src/ASTGrammar_gen.pir"
Tells you the source file where parrot most likely core dumped
(gdb) p pc - interpreter->code->base.data
$43 = 1022
1022 in this case is the Relative-PC in the src/ASTGrammar.pbc file.
(gdb) p interpreter->code->base.name
$48 = 0x82c23c8 "BYTECODE_src/ASTGrammar_gen.pir"
Given BYTECODE_src/ASTGrammar_gen.pir:
run disassemble on src/ASTGrammar.pbc
make disassemble
./disassemble languages/cardinal/src/ASTGrammar.pbc |less
And puff, smoke, magic:
I found out I was core dumping on line #459 of src/ASTGrammar_gen.pir
Kevin Tew (via RT) wrote:
# New Ticket Created by Kevin Tew
# Please include the string: [perl #39934]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=39934 >
embed.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
Feedback wanted.
Kevin
------------------------------------------------------------------------
Index: src/embed.c
===================================================================
--- src/embed.c (revision 13526)
+++ src/embed.c (working copy)
@@ -864,6 +864,10 @@
PDB_t *pdb;
PDB_line_t *line;
char *c;
+ int op_code_seq_num = 0;
+ int debugs;
+ int num_mappings;
+ int curr_mapping = 0;
pdb = (PDB_t *)mem_sys_allocate_zeroed(sizeof(PDB_t));
@@ -873,7 +877,36 @@
PDB_disassemble(interpreter, NULL);
line = pdb->file->line;
+ debugs = (interpreter->code->debugs != NULL);
+
+ PIO_printf(interpreter, "%12s-%12s", "Seq_Op_Num", "Relative-PC");
+ if ( debugs ) {
+ PIO_printf(interpreter, " %6s:\n","SrcLn#");
+ num_mappings = interpreter->code->debugs->num_mappings;
+ }
+ else {
+ PIO_printf(interpreter, "\n");
+ }
while (line->next) {
+ /* PIO_printf(interpreter, "%i < %i %i == %i \n", curr_mapping, num_mappings,
op_code_seq_num, interpreter->code->debugs->mappings[curr_mapping]->offset); */
+ if (debugs && curr_mapping < num_mappings)
+ {
+ if ( op_code_seq_num ==
interpreter->code->debugs->mappings[curr_mapping]->offset)
+ {
+ int filename_const_offset =
interpreter->code->debugs->mappings[curr_mapping]->u.filename;
+ PIO_printf(interpreter, "Current Source Filename %Ss\n",
interpreter->code->const_table->constants[filename_const_offset]->u.string);
+ curr_mapping++;
+ }
+ }
+
+ PIO_printf(interpreter, "%012i-%012i", op_code_seq_num, line->opcode -
interpreter->code->base.data);
+ if ( debugs ) {
+ PIO_printf(interpreter, " %06i:
\t",interpreter->code->debugs->base.data[op_code_seq_num]);
+ }
+ else {
+ PIO_printf(interpreter, "\t");
+ }
+
/* If it has a label print it */
if (line->label)
PIO_printf(interpreter, "L%li:\t", line->label->number);
@@ -882,6 +915,7 @@
PIO_printf(interpreter, "%c", *(c++));
PIO_printf(interpreter, "\n");
line = line->next;
+ op_code_seq_num++;
}
return;
}