Lukasz.dk

PS2Link Debugging

This tutorial is similar to the one I wrote about using the PS2Link exception screen for debugging. But instead of using ps2dis by Hanimar to find where the exception occurred, we use ee-addr2line, a tool which comes with GNU binutils, and which converts an address to a line number within a source file, hence the name of the tool. Like in the other tutorial, first I create a source file which tries to print the value at memory address 0 (zero).

1 #include <stdio.h>
2 
3 int main() 
4 { 
5 	u32* ptr = 0;
6 
7 	printf("Value: %i\n", *ptr); 
8 	return 0; 
9 }

This source is compiled with PS2SDK, so I create this makefile for it (see below). The thing to notice here is that I’ve added a flag ‘-g’ to CFLAGS. This tells GCC to generate debug information, which is required if we want to use ee-addr2line.bq.

EE_CFLAGS = -g 
EE_BIN = main.elf 
EE_OBJS = main.o 

all: $(EE_BIN) 

clean: 
	rm -f *.elf *.o *.a 
	
include $(PS2SDK)/samples/Makefile.pref 
include $(PS2SDK)/samples/Makefile.eeglobal

I use ps2client to send the ELF I’ve built, but first I type ps2client netdump, so that the exception gets sent to standard out on my pc. When I run this program ( ps2client execee host:main.elf ), I get the following exception.

...
           EE Exception handler: TLB load/inst fetch exception

   Cause d0008008  BadVAddr 00000000  Status 70030c13  EPC 00100278

zero: 00000000000000000000000000000000   t8: 00...
  at: 0000000000000000FFFFFFFF80020000   t9: 00...
...

I’m interested in the Exception Program Counter (EPC), which tells me where the exception happened. In this case the exception happened at address 0×00100278. I now use ee-addr2line to tell me in which source file the problem is.

lukasz@zen:~/ps2dev/projects/exception$ ee-addr2line -e main.elf 100278
/home/lukasz/ps2dev/projects/exception/main.c:7

ee-addr2line tells me the exception occurred on line 7 in main.c and I can now start bug-fixing.