Re: [DynInst_API:] PatchFunction blocks() crash


Date: Fri, 13 Mar 2015 13:52:47 -0500
From: Bill Williams <bill@xxxxxxxxxxx>
Subject: Re: [DynInst_API:] PatchFunction blocks() crash
On 03/12/2015 04:21 PM, Donghai wrote:
Hi,

 From the back trace info, the *_obj* pointer is NULL.
PatchObject *pbObj = _obj->addrSpace()->findObject(block->obj());

It's not actually the _obj, but its address space, that's NULL. The example is, I think, missing a step; you need to create an address space from your PatchObject with AddrSpace::create().

It's also possible that the correct logic here is:

PatchObject* pbObj;
if(_obj->addrSpace()) // block may not be in this PatchObject
{
    pbObj = _obj->addrSpace()->findObject(block->obj());
}
else // Everything must be local, as there's no address space
{
    pbObj = _obj;
}

Certainly in order to use PatchAPI for anything that you can't do with ParseAPI, you need an address space, which is why we haven't seen this in real tests...

On Wed, Mar 11, 2015 at 5:20 PM, Donghai <donghaitad@xxxxxxxxx
<mailto:donghaitad@xxxxxxxxx>> wrote:

    Hi Bill,

    The backtrace info is as follows:

    #0  Dyninst::PatchAPI::AddrSpace::findObject (this=0x0, co=0x8071648)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/patchAPI/src/AddrSpace.C:104
    #1  0xb7e18deb in Dyninst::PatchAPI::PatchParseCallback::add_edge_cb (
         this=0x8089890, block=0x8087708, edge=0x8082958,
         type=Dyninst::ParseAPI::ParseCallback::target)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/patchAPI/src/ParseCallback.C:148
    #2  0xb7e7cfb3 in add_edge_cb
    (t=Dyninst::ParseAPI::ParseCallback::target,
         e=0x8082958, b=0x8087708, this=0x8075c78)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/ParseCallback.C:254
    #3  Dyninst::ParseAPI::ParseCallbackManager::addEdge (this=0x8075c78,
         b=0x8087708, e=0x8082958,
    t=Dyninst::ParseAPI::ParseCallback::target)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/ParseCallback.C:147
    #4  0xb7e5e9fe in Dyninst::ParseAPI::Parser::link (this=0x8074f20,
         src=0x8087708, dst=0x80875c0, et=Dyninst::ParseAPI::RET,
    sink=false)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/Parser.C:1720
    #5  0xb7e744b9 in Dyninst::ParseAPI::CodeObject::add_edge
    (this=0x8071648,
         src=0x8087708, trg=0x80875c0, et=Dyninst::ParseAPI::RET)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/CodeObject.C:184
    #6  0xb7e6d4a6 in Dyninst::ParseAPI::Function::delayed_link_return (
         this=0x8076088, o=0x8071648, retblk=0x8087708)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/Function.C:358
    #7  0xb7e6dc80 in Dyninst::ParseAPI::Function::blocks_int
    (this=0x8076088)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/Function.C:306
    ---Type <return> to continue, or q <return> to quit---
    #8  0xb7e65843 in Dyninst::ParseAPI::Parser::finalize (this=0x8074f20,
         f=0x8076088)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/Parser.C:653
    #9  0xb7e6c87e in Dyninst::ParseAPI::Function::finalize (this=0x8076088)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/src/Function.C:184
    #10 0xb7e063e8 in num_blocks (this=0x8076088)
         at /home/tad/Desktop/Dyninst/Dyninst-8.2.1/parseAPI/h/CFG.h:489
    #11 Dyninst::PatchAPI::PatchFunction::blocks (this=0x808b270)
         at
    /home/tad/Desktop/Dyninst/Dyninst-8.2.1/patchAPI/src/PatchFunction.C:54
    #12 0x0804915f in main ()

    On Wed, Mar 11, 2015 at 12:00 PM, Bill Williams <bill@xxxxxxxxxxx
    <mailto:bill@xxxxxxxxxxx>> wrote:

        On 03/10/2015 08:26 PM, Donghai wrote:

            Hi,

            I use a very simple program to test the first example of
            PatchAPI.

            Unfortunately, the dyninst gets crash on this example. More

            specifically, func->blocks() cause the system segment fault.

            The code is pasted as follows, can someone give me some hint?

            Thanks.

        Can you send us a stack trace from gdb of the fault?

        It seems likely that some of our parseAPI optimizations are not
        playing nicely with this example, and that we're assuming data
        structures are populated before they actually are. If adding
        co->parse() before you create the PatchObject eliminates the
        crash, that's a good way to check whether we're being
        inappropriately lazy.


            Best
            Hai

            ParseAPI::SymtabCodeSource *sts;
            ParseAPI::CodeObject *co;
            Address code_base = 0x8048000;

            sts = new ParseAPI::SymtabCodeSource( argv[1] );
            co = new ParseAPI::CodeObject( sts );

            PatchObject *obj = PatchObject::create(co, code_base);

            // Find all functions in the object
            std::vector<PatchFunction*> all;
            obj->funcs(back_inserter(all))__;

            for (std::vector<PatchFunction*>::__iterator fi = all.begin();
                   fi != all.end(); fi++) {
                // Print out each function's name
                PatchFunction* func = *fi;
                std::cout << func->name() << std::endl;

                const PatchFunction::Blockset& blks = func->blocks();
                for (PatchFunction::BlockSet::__iterator bi = blks.begin();
                     bi != blks.end(); bi++) {
                  // Print out each block's size
                  PatchBlock* blk = *bi;
                  std::cout << "\tBlock size:" << blk->size() << std::endl;
                }
            }


            _________________________________________________
            Dyninst-api mailing list
            Dyninst-api@xxxxxxxxxxx <mailto:Dyninst-api@xxxxxxxxxxx>
            https://lists.cs.wisc.edu/__mailman/listinfo/dyninst-api
            <https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api>



        --
        --bw

        Bill Williams
        Paradyn Project
        bill@xxxxxxxxxxx <mailto:bill@xxxxxxxxxxx>
        _________________________________________________
        Dyninst-api mailing list
        Dyninst-api@xxxxxxxxxxx <mailto:Dyninst-api@xxxxxxxxxxx>
        https://lists.cs.wisc.edu/__mailman/listinfo/dyninst-api
        <https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api>





--
--bw

Bill Williams
Paradyn Project
bill@xxxxxxxxxxx
[← Prev in Thread] Current Thread [Next in Thread→]