[DynInst_API:] Function parameters inspection with GCC -O2 optimization


Date: Thu, 17 Jul 2014 14:03:11 -0400
From: Francis Deslauriers <francis.deslauriers@xxxxxxxxxxxx>
Subject: [DynInst_API:] Function parameters inspection with GCC -O2 optimization
Hi folks,
This email is part bug report and part question. I wanted to share
what I found while debugging this issue in order to helps someone that
would tackle this issue in the future.

I want to retrieve the parameters of a binary that has been compile
with gcc -O2 optimization option.

I made a dummy program (mutatee.c in the attached archive) that
contains a function named foo that has one parameter. I was wondering
why I was not able to get the parameter's name, type and eventually
value with my mutator program. So, I activated the
DYNINST_DEBUG_DWARF=1 env var to examine what was happening.
http://paste.ubuntu.com/7809741/. We can see on line 655 that there is
a failure parsing the third entry of the location list for the bar
variable.

Here is the function foo:
void __attribute__((noinline, noclone))
 foo(int bar)
{
    printf("%d",bar);
    return;
}

Using the following: objdump --dwarf=info mutatee
We can find the entry for the foo function and find the bar parameter
at the 0x2ec offset.
 <1><2cf>: Abbrev Number: 17 (DW_TAG_subprogram)
    <2d0>   DW_AT_external    : 1
    <2d0>   DW_AT_name        : foo
    <2d4>   DW_AT_decl_file   : 1
    <2d5>   DW_AT_decl_line   : 8
    <2d6>   DW_AT_prototyped  : 1
    <2d6>   DW_AT_low_pc      : 0x400650
    <2de>   DW_AT_high_pc     : 0x13
    <2e6>   DW_AT_frame_base  : 1 byte block: 9c        (DW_OP_call_frame_cfa)
    <2e8>   DW_AT_GNU_all_call_sites: 1
    <2e8>   DW_AT_sibling     : <0x34b>
 <2><2ec>: Abbrev Number: 18 (DW_TAG_formal_parameter)
    <2ed>   DW_AT_name        : bar
    <2f1>   DW_AT_decl_file   : 1
    <2f2>   DW_AT_decl_line   : 8
    <2f3>   DW_AT_type        : <0x5e>
    <2f7>   DW_AT_location    : 0x0     (location list)

We see at the last line that the DW_AT_location of the foo formal
parameter is a location list at offset 0x0 in the loc table which we
can examine using: objdump --dwarf=loc mutatee
    00000000 0000000000400650 000000000040065c (DW_OP_reg5 (rdi))
    00000013 000000000040065c 0000000000400662 (DW_OP_reg1 (rdx))
    00000026 0000000000400662 0000000000400663 (DW_OP_GNU_entry_value:
(DW_OP_reg5 (rdi)); DW_OP_stack_value)

So from my understanding, we aren't able to correctly parse the third
entry of the location list. Digging in the code I found that the
keyword
DW_OP_GNU_entry_value is not handle by the switch case in
dwarf/src/dwarfExprParser.C:126.it then falls in the default case and
then return false.
This behavior causes the mutator to return an empty vector when asked
for the parameters of the function.

My setup:
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
Dyninst branch v8.2

Is this an issue that is within Dyninst's control, more related to
libdwarf or something else?

Thanks,

Francis

Attachment: list-parameters.tar.gz
Description: GNU Zip compressed data

[← Prev in Thread] Current Thread [Next in Thread→]