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 <[email protected]> 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 <[email protected]> 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 >>> [email protected] >>> https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api >>> >>> >> >> -- >> --bw >> >> Bill Williams >> Paradyn Project >> [email protected] >> _______________________________________________ >> Dyninst-api mailing list >> [email protected] >> https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api >> > >
_______________________________________________ Dyninst-api mailing list [email protected] https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api
