Guest User

procapi.cpp

a guest
Aug 15th, 2014
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. #include <dyninst/Event.h>
  6. #include <dyninst/local_var.h>
  7.  
  8. using namespace ProcControlAPI;
  9.  
  10. struct s_t
  11. {
  12.     long int a;
  13.     int* b;
  14. };
  15.  
  16. bool bp_reached = false;
  17.  
  18. Process::cb_ret_t on_breakpoint(Event::const_ptr e) {
  19.     bp_reached = true;
  20.     return Process::cbDefault;
  21. }
  22.  
  23. int main(const int argc, const char * argv[]) {
  24.     // find symbol "foo"
  25.     Symtab *symtab = nullptr;
  26.     Symtab::openFile(symtab, "struct");
  27.     std::vector<Function *> functions;
  28.     symtab->findFunctionsByName(functions, "foo");
  29.     Function *f_foo = functions[0];
  30.  
  31.     // create process
  32.     std::vector<std::string> new_argv;
  33.     Process::ptr process = Process::createProcess("struct", new_argv);
  34.  
  35.     // insert breakpoint and callback
  36.     Breakpoint::ptr breakpoint = Breakpoint::newBreakpoint();
  37.     process->addBreakpoint(f_foo->getOffset(), breakpoint);
  38.     Process::registerEventCallback(EventType::Breakpoint, on_breakpoint);
  39.  
  40.     // run process
  41.     process->continueProc();
  42.  
  43.     // wait for breakpoint
  44.     while (!process->isTerminated() and !bp_reached) {
  45.         Process::handleEvents(true);
  46.     }
  47.  
  48.     // print some informations
  49.     {
  50.         Walker *walker = Walker::newWalker(process);
  51.         // stack trace
  52.         std::cout << "\nstack from bottom to top:\n";
  53.         std::vector<Frame> frames;
  54.         std::string name;
  55.         walker->walkStack(frames);
  56.         for (auto frame : frames) {
  57.             frame.getName(name);
  58.             std::cout << '\t' << name << "\tFP: " << frame.getFP() << "\tSP: " << frame.getSP() << '\n';
  59.         }
  60.  
  61.         // parameters
  62.         std::cout << "\nparameters:\n";
  63.         std::vector<localVar *> parameters;
  64.         f_foo->getParams(parameters);
  65.         for (auto param : parameters) {
  66.             std::cout << '\t' << param->getName() << ": " << param->getType()->getName() << " -- "
  67.                     << param->getType()->getSize() << " Bytes\n";
  68.  
  69.             std::cout << "\t --> Setting size to 0\n";
  70.             param->getType()->setSize(0);
  71.  
  72.             std::cout << '\t' << param->getName() << ": " << param->getType()->getName() << " -- "
  73.                     << param->getType()->getSize() << " Bytes\n";
  74.         }
  75.     }
  76.  
  77.     // continue
  78.     process->continueProc();
  79.  
  80.     // wait for exit
  81.     Process::handleEvents(true);
  82.  
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment