dots

Personal dotfiles
git clone git://git.gormless.xyz/dots.git
Log | Files | Refs

trump (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);