Re: [DynInst_API:] Deleting the snippets after reattaching


Date: Tue, 11 Nov 2014 11:14:56 -0600
From: Bill Williams <bill@xxxxxxxxxxx>
Subject: Re: [DynInst_API:] Deleting the snippets after reattaching
On 11/10/2014 04:08 AM, shruti wrote:
Hi,

We are developing the dynamic instrumentation tool using dyninst API's.

Please help me on this.

In the following code I am attaching to process,inserting the printf
snippet and detaching from it. Again I am reattaching to the same
process for the sake of deleting the snippet inserted previously.
But I am not able to delete the snippet. Is there any possible ways to
delete the snippet after reattaching to it.

Detaching and reattaching is not implemented in the way you want, and even if it were, this approach wouldn't work--the two BPatch_processes for the two different attach times don't know about each other's instrumentation state.

Ordinarily, we'd recommend continuing the process with a waitAndHandleEvents() loop until you reach some callback where you want to remove instrumentation or the process is terminated. Is there a reason that approach wouldn't work for your use case?

--bw

void usage() {
         cout<<"Please enter the pid and function name"<<endl;
}

int main(int argc , char *argv[])
{
         BPatch bpatch;
         int pid;
         bool ret;
         if (argc != 3) {
                 usage();
                 exit(1);
         }

         pid=atoi(argv[1]);

         cout<<"The attached pid is "<<pid<<endl;
         cout<<"the function name is "<<argv[2]<<endl;
         BPatch_process *appProc = bpatch.processAttach("",pid);
         BPatch_image *img = appProc->getImage();
         bpatch.setTrampRecursive(true);
         std::vector<BPatch_function *> printFuncs;
         img->findFunction(argv[2],printFuncs);
         if (printFuncs.size() == 0) {
                 cout<<"Unable to find function "<<argv[2]<<endl;
                 return -1;
         } else {
                  std::vector<BPatch_point *> *points;

                 std::vector<BPatch_snippet *> printArgs;
                 BPatch_snippet *fmt = new BPatch_constExpr("hello
world\n");
                 printArgs.push_back(fmt);

                 std::vector<BPatch_function *> printfFuncs;
                 img->findFunction("printf", printfFuncs);
                 BPatch_funcCallExpr printfCall(*(printfFuncs[0]),
printArgs);
                 points = printFuncs[0]->findPoint(BPatch_entry);
                 if ((*points).size() == 0) {
                         return false;
                 } else {
                         cout<<"Got the points "<<endl;
                 }
                 BPatchSnippetHandle *ptr;
                 ptr=appProc->insertSnippet(printfCall, *points);
                 if(!ptr)
                 {
                         cout<<"Failed to insert the snippet"<<endl;
                 } else {
                         cout<<"Snippet is inserted successfully"<<endl;
                 }
       }
         appProc->detach(true);
         cout<<"Done."<<endl;

         cout<<"Reattaching will be done again for deletion"<<endl;
         BPatch_process *appProc1 = bpatch.processAttach("", pid);
         BPatch_image *img1 = appProc1->getImage();
         if(img1) {
                 cout<<"Successfully got the image again"<<endl;
         } else {
                 cout<<"failed to get the image"<<endl;
         }

         std::vector<BPatch_function *> printFuncs1;
         img->findFunction(argv[2],printFuncs1);
         if (printFuncs1.size() == 0) {
                 cout<<"Unable to find function "<<argv[2]<<endl;
                 return -1;
         } else {
                  std::vector<BPatch_point *> *points1;

                 std::vector<BPatch_function *> printfFuncs1;
                 img->findFunction("printf", printfFuncs1);
                 points1 = printFuncs1[0]->findPoint(BPatch_entry);
                 if ((*points1).size() == 0) {
                         return false;
                 } else {
                         cout<<"Got the points 2nd time"<<endl;
                 }

                 BPatch_point pt=*(*points1)[0];
                 BPatch_Vector<BPatchSnippetHandle *> childSnippets =
pt.getCurrentSnippets(BPatch_callBefore);
                 if(childSnippets.size()==0){
                         cout<<" No snippets were found "<<endl;
                 } else {
                         cout<<"The snippet size is "
<<childSnippets.size()<<endl;
                 }
                 sleep(50);
                  bool ret=appProc->deleteSnippet(childSnippets[0]);
               if(ret)
               {
                         cout<<"The snippet is deleted"<<endl;
               } else {
                       cout<<"Failed to delete the snippet"<<endl;
               }


                 BPatch_point po=*(*points1)[0];


                 bool check=appProc1->removeFunctionCall(po);
                 if(check) {
                         cout<<"success"<<endl;
                 } else {
                         cout<<"failure"<<endl;
                 }

         }
         appProc1->detach(true);
         cout<<"Done for second time."<<endl;
         return 0;
}


Thanks,
Shruthi

_______________________________________________
Dyninst-api mailing list
Dyninst-api@xxxxxxxxxxx
https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api



--
--bw

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