本文整理汇总了C++中BPatch_image类的典型用法代码示例。如果您正苦于以下问题:C++ BPatch_image类的具体用法?C++ BPatch_image怎么用?C++ BPatch_image使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了BPatch_image类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main (int argc, const char* argv[]) {
BPatch bpatch;
// argv[2] is muttee's file name, will be muttee's argv[0]
BPatch_process *proc = bpatch.processCreate(argv[2], argv + 2);
// Options to tune performance
char *s;
if ((s = getenv("SET_TRAMP_RECURSIVE")) && (strcmp(s, "true") == 0))
bpatch.setTrampRecursive(true);
if ((s = getenv("SET_SAVE_FPR")) && (strcmp(s, "false") == 0))
bpatch.setSaveFPR(false);
BPatch_object *ipa = proc->loadLibrary(argv[1]);
BPatch_image *image = proc->getImage();
std::vector<BPatch_function *> tracepoints, probes;
image->findFunction("do_stuff", tracepoints);
BPatch_function *tracepoint = tracepoints[0];
image->findFunction("tpbench_no_arg", probes);
BPatch_function *probe = probes[0];
std::vector<BPatch_snippet*> args;
BPatch_funcCallExpr call_probe(*probe, args);
proc->insertSnippet(call_probe, (tracepoint->findPoint(BPatch_exit))[0]);
proc->detach(true);
return 0;
}
示例2: verifyProcMemory
/*
* Given a string variable name and an expected value, lookup the varaible
* in the process, and verify that the value matches.
*
*/
bool verifyProcMemory(BPatch_thread *appThread, const char *name,
int expectedVal, procType proc_type)
{
BPatch_image *appImage = appThread->getImage();
if (!appImage) {
dprintf("unable to locate image for %d\n", appThread->getPid());
return false;
}
BPatch_variableExpr *var = appImage->findVariable(name);
if (!var) {
dprintf("unable to located variable %s in child\n", name);
return false;
}
int actualVal;
var->readValue(&actualVal);
if (expectedVal != actualVal) {
fprintf(stderr,"*** for %s (%s), expected val = %d, but actual was %d\n",
name, procName[proc_type], expectedVal, actualVal);
return false;
} else {
dprintf("verified %s (%s) was = %d\n", name, procName[proc_type],
actualVal);
return true;
}
}
示例3: prepareTestCase6
void prepareTestCase6(procType proc_type, BPatch_thread *thread, forkWhen when)
{
const int TN = 6;
if(proc_type == Parent_p && when == PostFork) {
BPatch_image *parImage = thread->getImage();
BPatch_variableExpr *var7_6p =
parImage->findVariable("globalVariable7_6");
if(doError(TN, (var7_6p==NULL),
" Unable to locate variable globalVariable7_6\n")) return;
BPatch_arithExpr a_expr7_6p(BPatch_plus, *var7_6p, BPatch_constExpr(5));
BPatch_arithExpr b_expr7_6p(BPatch_assign, *var7_6p, a_expr7_6p);
thread->oneTimeCode(b_expr7_6p);
} else if(proc_type == Child_p && when == PostFork) {
BPatch_image *childImage = thread->getImage();
BPatch_variableExpr *var7_6c =
childImage->findVariable("globalVariable7_6");
if(doError(TN, (var7_6c==NULL),
" Unable to locate variable globalVariable7_6\n")) return;
BPatch_arithExpr a_expr7_6c(BPatch_plus, *var7_6c, BPatch_constExpr(9));
BPatch_arithExpr b_expr7_6c(BPatch_assign, *var7_6c, a_expr7_6c);
thread->oneTimeCode(b_expr7_6c);
}
}
示例4: parse_all
void DICFG::parse_all(void)
{
BPatch_addressSpace *handle = cfg_handle;
SymtabCodeSource *sts = cfg_sts;
CodeObject *co = cfg_co;
// Parse the binary
co->parse();
/* Parse the functions found by the BPatch API */
BPatch_image *image = handle->getImage();
std::vector<BPatch_module *> *mods = image->getModules();
std::vector<BPatch_module *>::iterator mods_iter;
for (mods_iter = mods->begin(); mods_iter != mods->end(); mods_iter++) {
address_t mod_start = (address_t)(*mods_iter)->getBaseAddr();
address_t mod_end = (address_t)(*mods_iter)->getBaseAddr() + (*mods_iter)->getSize();
if((get_start_addr() == 0) || (mod_start < get_start_addr())) {
set_start_addr(mod_start);
}
if((get_end_addr() == 0) || (mod_end > get_end_addr())) {
set_end_addr(mod_end);
}
std::vector<BPatch_function *> *funcs = (*mods_iter)->getProcedures(false);
std::vector<BPatch_function *>::iterator funcs_iter = funcs->begin();
for(; funcs_iter != funcs->end(); funcs_iter++) {
co->parse((Address)(*funcs_iter)->getBaseAddr(), true);
}
}
/* Parse PLT entries */
Symtab *symtab = Symtab::findOpenSymtab(string((char *) this->get_module_name().c_str()));
vector<SymtabAPI::relocationEntry> fbt;
vector<SymtabAPI::relocationEntry>::iterator fbt_iter;
symtab->getFuncBindingTable(fbt);
for (fbt_iter = fbt.begin(); fbt_iter != fbt.end(); fbt_iter++) {
co->parse((Address)((*fbt_iter).target_addr()), true);
}
const CodeObject::funclist& funcs = co->funcs();
insert_functions_and_bbs(funcs);
for (fbt_iter = fbt.begin(); fbt_iter != fbt.end(); fbt_iter++) {
address_t plt_fun_addr = (address_t)(*fbt_iter).target_addr();
if((get_start_addr() == 0) || (plt_fun_addr < get_start_addr())) {
set_start_addr(plt_fun_addr);
}
if((get_end_addr() == 0) || (plt_fun_addr > get_end_addr())) {
set_end_addr(plt_fun_addr);
}
mark_function_as_plt(plt_fun_addr);
}
}
示例5: main
int main()
{
BPatch bpatch;
BPatch_process* appProc = bpatch.processCreate("/bin/ls", NULL);
BPatch_image* img = NULL;
img = appProc->getImage();
vector<BPatch_module*> *mdl = img->getModules();
vector<BPatch_module*>::iterator moduleIter = mdl->begin();
void* addr = (*moduleIter)->getBaseAddr();
printf("0x%x\n",addr);
return 0;
}
示例6: setFuncModulesCallback
bool BPatch_image::setFuncModulesCallback(BPatch_function *bpf, void *data)
{
BPatch_image *img = (BPatch_image *) data;
if (bpf->getModule() == NULL && bpf->func->mod() != NULL) {
bpf->mod = img->findModule(bpf->func->mod()->fileName().c_str());
}
if( bpf->getModule() == NULL ) {
char name[256];
fprintf(stderr, "Warning: bpf '%s' unclaimed, setting to DEFAULT_MODULE\n",
bpf->getName( name, 255 ) );
bpf->setModule( img->defaultModule );
}
return true;
}
示例7: prepareTestCase9
void prepareTestCase9(procType proc_type, BPatch_thread *thread, forkWhen when)
{
const int TN = 9;
if(proc_type == Parent_p && when == PreFork) {
BPatch_image *parImage = thread->getImage();
var7_9p = thread->malloc(*(parImage->findType("int")));
if(doError(TN, (var7_9p==NULL),
" Unable to malloc variable in parent\n")) return;
BPatch_arithExpr a_expr7_9p(BPatch_assign, *var7_9p,
BPatch_constExpr(10));
thread->oneTimeCode(a_expr7_9p);
} else if(proc_type == Parent_p && when == PostFork) {
// can't delete var7_9p here, since then the getInheritedVariable
// would be operating on a freed variable
} else if(proc_type == Child_p && when == PostFork) {
var7_9c = thread->getInheritedVariable(*var7_9p);
parentThread->free(*var7_9p);
BPatch_image *childImage = thread->getImage();
BPatch_Vector<BPatch_function *> found_funcs;
const char *inFunction = "func7_9";
if ((NULL == childImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
fprintf(stderr, " Unable to find function %s\n",
inFunction);
exit(1);
}
if (1 < found_funcs.size()) {
fprintf(stderr, "%s[%d]: WARNING : found %d functions named %s. Using the first.\n",
__FILE__, __LINE__, found_funcs.size(), inFunction);
}
BPatch_Vector<BPatch_point *> *points7_9c = found_funcs[0]->findPoint(BPatch_entry);
if(doError(TN, !points7_9c || ((*points7_9c).size() == 0),
" Unable to find entry point to \"func7_9\".\n")) return;
BPatch_point *point7_9c = (*points7_9c)[0];
BPatch_arithExpr a_expr7_9c(BPatch_plus, *var7_9c, BPatch_constExpr(5));
BPatch_arithExpr b_expr7_9c(BPatch_assign, *var7_9c, a_expr7_9c);
thread->insertSnippet(b_expr7_9c, *point7_9c, BPatch_callBefore);
}
}
示例8: prepareTestCase1
void prepareTestCase1(procType proc_type, BPatch_thread *thread, forkWhen when)
{
static BPatchSnippetHandle *parSnippetHandle1;
if(proc_type == Parent_p && when == PreFork) {
BPatch_image *parImage = thread->getImage();
BPatch_Vector<BPatch_function *> found_funcs;
const char *inFunction = "func7_1";
if ((NULL == parImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
fprintf(stderr, " Unable to find function %s\n",
inFunction);
exit(1);
}
if (1 < found_funcs.size()) {
fprintf(stderr, "%s[%d]: WARNING : found %d functions named %s. Using the first.\n",
__FILE__, __LINE__, found_funcs.size(), inFunction);
}
BPatch_Vector<BPatch_point *> *point7_1p = found_funcs[0]->findPoint(BPatch_entry);
if(doError(1, !point7_1p || ((*point7_1p).size() == 0),
" Unable to find entry point to \"func7_1\".\n")) return;
BPatch_variableExpr *var7_1p =
parImage->findVariable("globalVariable7_1");
if(doError(1, (var7_1p==NULL),
" Unable to locate variable globalVariable7_1\n")) return;
BPatch_arithExpr expr7_1p(BPatch_assign, *var7_1p,BPatch_constExpr(321));
parSnippetHandle1 =
thread->insertSnippet(expr7_1p, *point7_1p, BPatch_callBefore);
if(doError(1, (parSnippetHandle1 == NULL),
" Unable to insert snippet into parent for test 1\n")) return;
} else if(proc_type == Parent_p && when == PostFork) {
thread->deleteSnippet(parSnippetHandle1);
}
}
示例9: prepareTestCase4
void prepareTestCase4(procType proc_type, BPatch_thread *thread, forkWhen when)
{
const int TN = 4;
static BPatchSnippetHandle *parSnippetHandle4;
if(proc_type == Child_p && when == PostFork) {
BPatch_image *childImage = thread->getImage();
BPatch_Vector<BPatch_function *> found_funcs;
const char *inFunction = "func7_4";
if ((NULL == childImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
fprintf(stderr, " Unable to find function %s\n",
inFunction);
exit(1);
}
if (1 < found_funcs.size()) {
fprintf(stderr, "%s[%d]: WARNING : found %d functions named %s. Using the first.\n",
__FILE__, __LINE__, found_funcs.size(), inFunction);
}
BPatch_Vector<BPatch_point *> *points7_4c = found_funcs[0]->findPoint(BPatch_entry);
if(doError(TN, !points7_4c || ((*points7_4c).size() == 0),
" Unable to find entry point to \"func7_4\".\n")) return;
BPatch_point *point7_4c = (*points7_4c)[0];
BPatch_variableExpr *var7_4c =
childImage->findVariable("globalVariable7_4");
if(doError(TN, (var7_4c==NULL),
" Unable to locate variable globalVariable7_4\n")) return;
BPatch_arithExpr a_expr7_4c(BPatch_plus, *var7_4c,BPatch_constExpr(211));
BPatch_arithExpr b_expr7_4c(BPatch_assign, *var7_4c, a_expr7_4c);
parSnippetHandle4 =
thread->insertSnippet(b_expr7_4c, *point7_4c, BPatch_callBefore);
}
}
示例10: defined
//.........这里部分代码省略.........
bperr("got n_offset-3 = %x\n", stabstr[sym->n_offset-3]);
if (sym->n_offset>=4)
bperr("got n_offset-4 = %x\n", stabstr[sym->n_offset-4]);
#endif
} else {
// names 8 or less chars on inline, not in stabstr
memset(tempName, 0, 9);
strncpy(tempName, sym->n_name, 8);
nmPtr = tempName;
}
if ((sym->n_sclass == C_BINCL) ||
(sym->n_sclass == C_EINCL) ||
(sym->n_sclass == C_FUN)) {
funcName = nmPtr;
/* The call to parseLineInformation(), below, used to modify the symbols passed to it. */
if (funcName.find(":") < funcName.length())
funcName = funcName.substr(0,funcName.find(":"));
// I'm not sure why we bother with this here, since we fetch line numbers in symtab.C anyway.
// mod->parseLineInformation(proc->llproc, currentSourceFile,
// funcName, sym,
// linesfdptr, lines, nlines);
}
if (sym->n_sclass & DBXMASK) {
if (sym->n_sclass == C_BCOMM) {
char *commonBlockName;
inCommonBlock = true;
commonBlockName = nmPtr;
// find the variable for the common block
BPatch_image *progam = (BPatch_image *) getObjParent();
commonBlockVar = progam->findVariable(commonBlockName);
if (!commonBlockVar) {
bperr("unable to find variable %s\n", commonBlockName);
} else {
commonBlock =
dynamic_cast<BPatch_typeCommon *>(const_cast<BPatch_type *> (commonBlockVar->getType()));
if (commonBlock == NULL) {
// its still the null type, create a new one for it
commonBlock = new BPatch_typeCommon(commonBlockName);
commonBlockVar->setType(commonBlock);
moduleTypes->addGlobalVariable(commonBlockName, commonBlock);
}
// reset field list
commonBlock->beginCommonBlock();
}
} else if (sym->n_sclass == C_ECOMM) {
inCommonBlock = false;
if (commonBlock == NULL)
continue;
// copy this set of fields
BPatch_Vector<BPatch_function *> bpmv;
if (NULL == findFunction(funcName.c_str(), bpmv) || !bpmv.size()) {
bperr("unable to locate current function %s\n", funcName.c_str());
} else {
BPatch_function *func = bpmv[0];
commonBlock->endCommonBlock(func, commonBlockVar->getBaseAddr());
}
// update size if needed
if (commonBlockVar)
示例11: prepareTestCase3
void prepareTestCase3(procType proc_type, BPatch_thread *thread, forkWhen when)
{
static BPatchSnippetHandle *parSnippetHandle3;
if(proc_type == Parent_p && when == PreFork) {
BPatch_image *parImage = thread->getImage();
BPatch_Vector<BPatch_function *> found_funcs;
const char *inFunction = "func7_3";
if ((NULL == parImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
fprintf(stderr, " Unable to find function %s\n",
inFunction);
exit(1);
}
if (1 < found_funcs.size()) {
fprintf(stderr, "%s[%d]: WARNING : found %d functions named %s. Using the first.\n",
__FILE__, __LINE__, found_funcs.size(), inFunction);
}
BPatch_Vector<BPatch_point *> *points7_3p = found_funcs[0]->findPoint(BPatch_entry);
if(doError(3, !points7_3p || ((*points7_3p).size() == 0),
" Unable to find entry point to \"func7_3\".\n")) return;
BPatch_point *point7_3p = (*points7_3p)[0];
BPatch_variableExpr *var7_3p =
parImage->findVariable("globalVariable7_3");
if(doError(3, (var7_3p==NULL),
" Unable to locate variable globalVariable7_3\n")) return;
BPatch_arithExpr expr7_3p(BPatch_assign, *var7_3p,BPatch_constExpr(642));
parSnippetHandle3 =
thread->insertSnippet(expr7_3p, *point7_3p, BPatch_callBefore);
} else if(proc_type == Parent_p && when == PostFork) {
bool result = thread->deleteSnippet(parSnippetHandle3);
if(result == false) {
fprintf(stderr, " error, couldn't delete snippet\n");
passedTest[3] = false;
return;
}
} else if(proc_type == Child_p && when == PostFork) {
BPatch_image *childImage = thread->getImage();
BPatch_Vector<BPatch_function *> found_funcs;
const char *inFunction = "func7_3";
if ((NULL == childImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
fprintf(stderr, " Unable to find function %s\n",
inFunction);
exit(1);
}
if (1 < found_funcs.size()) {
fprintf(stderr, "%s[%d]: WARNING : found %d functions named %s. Using the first.\n",
__FILE__, __LINE__, found_funcs.size(), inFunction);
}
BPatch_Vector<BPatch_point *> *points7_3c = found_funcs[0]->findPoint(BPatch_entry);
if(doError(3, !points7_3c || ((*points7_3c).size() == 0),
" Unable to find entry point to \"func7_3\".\n")) return;
BPatch_point *point7_3c = (*points7_3c)[0];
BPatch_Vector<BPatchSnippetHandle *> childSnippets =
point7_3c->getCurrentSnippets();
if(doError(3, (childSnippets.size()==0),
" No snippets were found at func7_3\n")) return;
for(unsigned i=0; i<childSnippets.size(); i++) {
bool result = thread->deleteSnippet(childSnippets[i]);
if(result == false) {
fprintf(stderr, " error, couldn't delete snippet\n");
passedTest[3] = false;
return;
}
}
}
}
示例12: dprintf
// static int mutatorTest(char *pathname, BPatch *bpatch)
test_results_t test1_41_Mutator::executeTest() {
unsigned int n=0;
const char *child_argv[5];
child_argv[n++] = pathname;
if (debugPrint) child_argv[n++] = const_cast<char*>("-verbose");
child_argv[n++] = const_cast<char*>("-run");
child_argv[n++] = const_cast<char*>("test1_41"); // run test41 in mutatee
child_argv[n++] = NULL;
int counts[iterations];
// Run the mutatee twice, querying line info each time & store the info
for (n = 0; n < iterations; n++) {
dprintf("Starting \"%s\"\n", pathname);
BPatch_process *proc = bpatch->processCreate(pathname, child_argv,
NULL);
if (!proc) {
logerror("*ERROR*: unable to create handle for executable\n", n);
logerror("**Failed** test #41 (repeated line information)\n");
return FAILED;
}
dprintf("Mutatee started, pid=%d\n", n, proc->getPid());
BPatch_image *image = proc->getImage();
if (!image) {
logerror("*ERROR*: unable to get image from thread\n");
logerror("**Failed** test #41 (repeated line information)\n");
return FAILED;
}
if (isMutateeFortran(image)) {
// This shouldn't happen..
proc->terminateExecution();
logerror("Skipped test #41 (repeated line information)\n");
return SKIPPED;
}
BPatch_module *module = image->findModule("test1_41_mutatee.c", true);
if (!module) {
module = image->findModule("solo_mutatee_boilerplate.c", true);
if (true) {
logerror("*ERROR*: unable to get module from image\n");
logerror("Looking for \"test1_41_solo_me.c\" or \"solo_mutatee_boilerplate.c\". Available modules:\n");
BPatch_Vector<BPatch_module *> *mods = image->getModules();
char buffer[512];
for (unsigned i = 0; i < mods->size(); i++) {
BPatch_module *mod = (*mods)[i];
char name[512];
mod->getName(name, 512);
sprintf(buffer, "\t%s\n",
name);
logerror(buffer);
}
}
}
if (!module) {
fprintf(stderr, "%s[%d]: could not find module solo_mutatee_boilerplate.c\n", FILE__, __LINE__);
// First try again for 'test1_41_solo_me.c'
module = image->findModule("test1_41_solo_me.c", true);
if (!module) {
logerror("*ERROR*: unable to get module from image\n");
logerror("Looking for \"test1_41_solo_me.c\" or \"solo_mutatee_boilerplate.c\". Available modules:\n");
BPatch_Vector<BPatch_module *> *mods = image->getModules();
char buffer[512];
for (unsigned i = 0; i < mods->size(); i++) {
BPatch_module *mod = (*mods)[i];
char name[512];
mod->getName(name, 512);
sprintf(buffer, "\t%s\n",
name);
logerror(buffer);
}
logerror("**Failed** test #41 (repeated line information)\n");
return FAILED;
}
}
char buffer[16384]; // FIXME ugly magic number; No module name should be that long..
module->getName(buffer, sizeof(buffer));
BPatch_Vector<BPatch_statement> statements;
bool res = module->getStatements(statements);
if (!res) {
fprintf(stderr, "%s[%d]: getStatements()\n", __FILE__, __LINE__);
return FAILED;
}
counts[n] = statements.size();
dprintf("Trial %d: found %d statements\n", n, statements.size());
proc->terminateExecution();
}
// Make sure we got the same info each time we ran the mutatee
int last_count = -1;
for (int i = 0; i < iterations; i++) {
if ((last_count >= 0) && (last_count != counts[i])) {
//.........这里部分代码省略.........
示例13: execFunc
void execFunc(BPatch_thread *thread)
{
BPatch_Vector<BPatch_function *> bpfv;
if (inTest == 1 || inTest == 2) {
printf("**Failed Test #%d\n", inTest);
printf(" execCallback invoked, but exec was not called!\n");
} else if (inTest == 3) {
dprintf("in exec callback for %d\n", thread->getPid());
// insert code into parent
BPatch_Vector<BPatch_snippet *> nullArgs;
BPatch_image *appImage = thread->getImage();
assert(appImage);
char *fn = "func3_2";
if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn);
exit(1);
}
BPatch_function *func3_2_parent = bpfv[0];
BPatch_funcCallExpr callExpr(*func3_2_parent, nullArgs);
bpfv.clear();
char *fn2 = "func3_1";
if (NULL == appImage->findFunction(fn2, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn2);
exit(1);
}
BPatch_function *func3_1_parent = bpfv[0];
BPatch_Vector<BPatch_point *> *point = func3_1_parent->findPoint(BPatch_exit);
assert(point);
thread->insertSnippet(callExpr, *point);
dprintf("%s[%d]: MUTATEE: exec callback for %d, done with insert snippet\n", __FILE__, __LINE__, thread->getPid());
} else if (inTest == 4) {
dprintf("in exec callback for %d\n", thread->getPid());
// insert code into child
BPatch_Vector<BPatch_snippet *> nullArgs;
BPatch_image *appImage = thread->getImage();
assert(appImage);
char *fn3 = "func4_4";
if (NULL == appImage->findFunction(fn3, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn3);
exit(1);
}
BPatch_function *func4_4_child = bpfv[0];
BPatch_funcCallExpr callExpr1(*func4_4_child, nullArgs);
bpfv.clear();
char *fn4 = "func4_2";
if (NULL == appImage->findFunction(fn4, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn4);
exit(1);
}
BPatch_function *func4_2_child = bpfv[0];
BPatch_Vector<BPatch_point *> *point1 = func4_2_child->findPoint(BPatch_exit);
assert(point1);
thread->insertSnippet(callExpr1, *point1);
} else {
printf("in exec callback for %d\n", thread->getPid());
}
}
示例14: forkFunc
void forkFunc(BPatch_thread *parent, BPatch_thread *child)
{
dprintf("forkFunc called with parent %p, child %p\n", parent, child);
BPatch_image *appImage;
BPatch_Vector<BPatch_function *> bpfv;
BPatch_Vector<BPatch_snippet *> nullArgs;
if (child) mythreads[threadCount++] = child;
if (!child) {
dprintf("in prefork for %d\n", parent->getPid());
} else {
dprintf("in fork of %d to %d\n", parent->getPid(), child->getPid());
}
if (inTest == 1) {
// nothing to do for this case
} else if (inTest == 2) {
if (!child) return; // skip prefork case
// Make a race condition always show up -- we don't run
// until the processes have had a chance.
#if !defined(os_windows)
sleep(1);
#endif
// That'll make erroneous continues break...
// insert code into parent
appImage = parent->getImage();
assert(appImage);
char *fn = "func2_3";
if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn);
exit(1);
}
BPatch_function *func2_3_parent = bpfv[0];
BPatch_funcCallExpr callExpr2(*func2_3_parent, nullArgs);
bpfv.clear();
char *fn2 = "func2_2";
if (NULL == appImage->findFunction(fn2, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn2);
exit(1);
}
BPatch_function *func2_2_parent = bpfv[0];
BPatch_Vector<BPatch_point *> *point2 = func2_2_parent->findPoint(BPatch_exit);
assert(point2);
parent->insertSnippet(callExpr2, *point2);
dprintf("MUTATEE: after insert in fork of %d to %d\n", parent->getPid(), child->getPid());
// insert different code into child
appImage = child->getImage();
assert(appImage);
bpfv.clear();
char *fn3 = "func2_4";
if (NULL == appImage->findFunction(fn3, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn3);
exit(1);
}
BPatch_function *func2_4_child = bpfv[0];
BPatch_funcCallExpr callExpr1(*func2_4_child, nullArgs);
bpfv.clear();
char *fn4 = "func2_2";
if (NULL == appImage->findFunction(fn4, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn4);
exit(1);
}
BPatch_function *func2_2_child = bpfv[0];
BPatch_Vector<BPatch_point *> *point1 = func2_2_child->findPoint(BPatch_exit);
assert(point1);
child->insertSnippet(callExpr1, *point1);
dprintf("MUTATEE: after insert2 in fork of %d to %d\n", parent->getPid(), child->getPid());
test2Child = child;
test2Parent = parent;
} else if (inTest == 4) {
if (!child) return; // skip prefork case
// insert code into parent
appImage = parent->getImage();
assert(appImage);
char *fn5 = "func4_3";
if (NULL == appImage->findFunction(fn5, bpfv) || !bpfv.size()
|| NULL == bpfv[0]){
fprintf(stderr, " Unable to find function %s\n",fn5);
exit(1);
//.........这里部分代码省略.........
示例15: main
int main (int argc, char *argv[])
{
set<string> Routines;
char *env_var;
int index;
if ((env_var = getenv ("DYNINSTAPI_RT_LIB")) == NULL)
{
env_var = (char*) malloc ((1+strlen("DYNINSTAPI_RT_LIB=")+strlen(DYNINST_RT_LIB))*sizeof(char));
if (env_var == NULL)
{
cerr << PACKAGE_NAME << ": Cannot allocate memory to define DYNINSTAPI_RT_LIB!" << endl;
exit (-1);
}
sprintf (env_var, "DYNINSTAPI_RT_LIB=%s", DYNINST_RT_LIB);
putenv (env_var);
}
else
cout << PACKAGE_NAME << ": Warning, DYNINSTAPI_RT_LIB already set and pointing to " <<
env_var << endl;
/* Parse the params */
index = processParams (argc, argv, Routines);
/* Does the binary exists? */
if (!__Extrae_Utils_file_exists(argv[index]))
{
cout << PACKAGE_NAME << ": Executable " << argv[index] << " cannot be found!" << endl;
exit (-1);
}
if (Routines.size() > 0)
{
set<string>::iterator it;
cout << PACKAGE_NAME << ": Will instrument routines ";
for (it = Routines.begin(); it != Routines.end(); it++)
cout << *it << " ";
cout << endl;
}
/* Create an instance of the BPatch library */
bpatch = new BPatch;
/* Register a callback function that prints any error messages */
bpatch->registerErrorCallback (errorFunc);
/* Don't check recursion in snippets */
bpatch->setTrampRecursive (true);
cout << "Welcome to " << PACKAGE_STRING << " launcher using DynInst "
<< DYNINST_MAJOR << "." << DYNINST_MINOR << "." << DYNINST_SUBMINOR << endl;
int i = 1;
while (argv[index+i] != NULL)
{
cout << PACKAGE_NAME << ": Argument " << i << " - " << argv[index+i] << endl;
i++;
}
cout << PACKAGE_NAME << ": Creating process for image binary " << argv[index];
cout.flush ();
BPatch_process * appProcess =
bpatch->processCreate ((const char*) argv[index], (const char**) &argv[index], (const char**) environ);
if (appProcess == NULL)
{
cerr << endl << PACKAGE_NAME << ": Error creating the target application process" << endl;
exit (-1);
}
cout << endl;
/* Stop the execution in order to load the instrumentation library */
cout << PACKAGE_NAME << ": Stopping mutatee execution" << endl;
if (!appProcess->stopExecution())
{
cerr << PACKAGE_NAME << ": Cannot stop execution of the target application" << endl;
exit (-1);
}
cout << PACKAGE_NAME << ": Acquiring process image" << endl;
BPatch_image *appImage = appProcess->getImage();
if (appImage == NULL)
{
cerr << PACKAGE_NAME << ": Error while acquiring application image" << endl;
exit (-1);
}
cout << PACKAGE_NAME << ": Looking for printf symbol in application image" << endl;
appImage->findFunction ("printf", printfFuncs);
if (printfFuncs.size() == 0)
{
cerr << PACKAGE_NAME << ": Error! Cannot locate printf function within image" << endl;
exit (-1);
}
if (!ListFunctions)
{
InstrumentCalls (appImage, appProcess, Routines);
cout << PACKAGE_NAME << ": Starting program execution" << endl;
if (!appProcess->continueExecution())
//.........这里部分代码省略.........