Re: [DynInst_API:] PatchFunction blocks() crash


Date: Thu, 12 Mar 2015 17:21:28 -0400
From: Donghai <donghaitad@xxxxxxxxx>
Subject: Re: [DynInst_API:] PatchFunction blocks() crash
Hi,

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

On Wed, Mar 11, 2015 at 5:20 PM, Donghai <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="" 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="" 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> 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
https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api



--
--bw

Bill Williams
Paradyn Project
bill@xxxxxxxxxxx
_______________________________________________
Dyninst-api mailing list
Dyninst-api@xxxxxxxxxxx
https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api


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