ttrump - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       ttrump (3164B)
       ---
            1 // trace user malloc pool - trace malloc, realloc, and free calls
            2 // if trumpsbrk is set, we trace sbrkalloc and sbrkmerge too.
            3 
            4 _stoprunning = 0;
            5 trumphexaddrs = 0;
            6 trumpsbrk = 0;
            7 
            8 defn stopped(pid) {
            9         local l;
           10         local pc;
           11         pc = *PC;
           12         if notes then {
           13                 if (notes[0]!="sys: breakpoint") then
           14                 {
           15                         print(pid,": ",reason(*TRAP),"\t");
           16                         print(fmt(pc,97),"\t",fmt(pc,105),"\n");
           17                         print("Notes pending:\n");
           18                         l = notes;
           19                         while l do
           20                         {
           21                                 print("\t",head l,"\n");
           22                                 l = tail l;
           23                         }
           24                         _stoprunning = 1;
           25                 }
           26         }
           27 }
           28 
           29 defn printstack() {
           30         local frame, stk, pcs, lst, x;
           31 
           32         pcs = {*PC};
           33         stk = strace(*PC,*SP,0);
           34         while stk do {
           35                 pcs = append pcs, stk[0][1];
           36                 stk = tail stk;
           37         }
           38 
           39         print(" #");
           40         lst = pcs;
           41         while lst do {
           42                 if trumphexaddrs != 0 then
           43                         x = lst[0]\X;
           44                 else
           45                         x = lst[0]\a;
           46                 print(" src(", x, ");");
           47                 lst = tail lst;
           48         }
           49         print("\n");
           50 }
           51 
           52 defn setuptrump() {
           53         mallocPC = malloc;
           54         malloczPC = mallocz;
           55         freePC = free;
           56         reallocPC = realloc;
           57         sbrkallocPC = sbrkalloc;
           58         sbrkmergePC = sbrkmerge;
           59 
           60         // linker might fill delay slot with first instruction
           61         if objtype == "mips" then {
           62                 mallocPC = mallocPC+4;
           63                 malloczPC = malloczPC+4;
           64                 freePC = freePC+4;
           65                 reallocPC = reallocPC+4;
           66                 sbrkallocPC = sbrkallocPC+4;
           67                 sbrkmergePC = sbrkmergePC+4;
           68         }
           69 
           70         bpset(mallocPC);
           71         bpset(malloczPC);
           72         bpset(freePC);
           73         bpset(reallocPC);
           74         if trumpsbrk then {
           75                 bpset(sbrkallocPC);
           76                 bpset(sbrkmergePC);
           77         }
           78 }
           79 
           80 defn cleantrump() {
           81         stop(pid);
           82 
           83         bpdel(mallocPC);
           84         bpdel(malloczPC);
           85         bpdel(freePC);
           86         bpdel(reallocPC);
           87         bpdel(sbrkallocPC);
           88         bpdel(sbrkmergePC);
           89 }
           90 
           91 defn trumpflush() {
           92         stop(pid);                // already stopped, but flushes output
           93 }
           94 
           95 defn new() {
           96         bplist = {};
           97         newproc(progargs);
           98         bpset(follow(main)[0]);
           99         cont();
          100         bpdel(*PC);
          101         // clear the hang bit, which is left set by newproc, so programs we fork/exec don't hang
          102         printto("/proc/"+itoa(pid)+"/ctl", "nohang");
          103 }
          104 
          105 defn trumpfninfo() {
          106         local arg0, arg1, stk, retpc, params;
          107 
          108         stk = strace(*PC, *SP, 0);
          109         retpc = stk[0][1];
          110         params = stk[0][2];
          111         arg0 = params[0][1];
          112         arg1 = 0;
          113         if tail params != {} then
          114                 arg1 = params[1][1];
          115         return {arg0, arg1, retpc};
          116 }
          117 
          118 defn trumpretval() {
          119         if objtype=="386" then
          120                 return *AX;
          121         if objtype=="mips" then
          122                 return *R1;
          123         if objtype=="power" || objtype=="alpha" then
          124                 return *R0;
          125 }
          126 
          127 defn trump() {
          128         local arg0, arg1, pc, ret, x;
          129 
          130         stop(pid);
          131         _stoprunning = 0;
          132         setuptrump();
          133         while !_stoprunning do {
          134                 cont();
          135                 if notes[0]!="sys: breakpoint" then {
          136                         cleantrump();
          137                         return {};
          138                 }
          139 
          140                 pc = *PC;
          141                 x = trumpfninfo();
          142                 arg0 = x[0];
          143                 if pc == reallocPC || pc == sbrkmergePC then 
          144                         arg1 = x[1];
          145                 bpset(x[2]);
          146                 cont();
          147                 bpdel(x[2]);
          148                 ret = trumpretval();
          149                 if pc == mallocPC then
          150                         print(ret\X, " malloc ", arg0\D);
          151                 if pc == malloczPC then
          152                         print(ret\X, " mallocz ", arg0\D);
          153                 if pc == freePC then
          154                         print(arg0\X, " free");
          155                 if pc == reallocPC then
          156                         print(ret\X, " realloc ", arg0\X, " ", arg1\D);
          157                 if pc == sbrkallocPC then
          158                         print(ret\X, " sbrkalloc ", arg0\D);
          159                 if pc == sbrkmergePC then
          160                         print("sbrkmerge ", arg0\X, " ", arg1\X, " = ", ret\D);
          161                 printstack();
          162                 trumpflush();
          163         }
          164 }
          165 
          166 defn untrump() {
          167         cleantrump();
          168         start(pid);
          169 }
          170 
          171 print(acidfile);