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
|