forums.ps2dev.org Forum Index forums.ps2dev.org
Homebrew PS2, PSP & PS3 Development Discussions
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

GDB on PS2

 
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PS2 Development
View previous topic :: View next topic  
Author Message
RandomZero



Joined: 23 Dec 2005
Posts: 2

PostPosted: Fri Dec 23, 2005 4:30 pm    Post subject: GDB on PS2 Reply with quote

Does anyone know of a GDB port (or any other PS2-side debugger) which runs on the PS2, and which will allow remote debugging via a Windows sytem running VC6?

Ie, allow execution of a binary compiled with plugin tools in VC6, initiate transfer of the binary to the PS2, and allow windows side stepping through of that binary running on the PS2.

If not, I might look at getting gdb running on the PS2 for such a purpose.
Back to top
View user's profile Send private message
Drakonite
Site Admin


Joined: 17 Jan 2004
Posts: 989

PostPosted: Sat Dec 24, 2005 2:01 am    Post subject: Reply with quote

If you look in svn there is "ps2gdb" ;) .. Of course, the last I knew it did not work very well, i.e. it was extremely slow. If you can get it working nicely you'd make a lot of people happy.
_________________
Shoot Pixels Not People!
Makeshift Development
Back to top
View user's profile Send private message Visit poster's website
Mega Man



Joined: 18 Jun 2005
Posts: 274

PostPosted: Sun Jan 01, 2006 1:51 am    Post subject: Reply with quote

I used a normal gdb 6.3 with the following configuration:
./configure --host=i686-pc-linux-gnu --target=mips32

and the following patch for ps2gdb (this patch uses 32 Bits for all registers):
Code:

Index: ee/Makefile
===================================================================
RCS file: /home/ps2cvs/ps2gdb/ee/Makefile,v
retrieving revision 1.3
diff -u -r1.3 Makefile
--- ee/Makefile   26 Oct 2004 10:07:53 -0000   1.3
+++ ee/Makefile   3 Jul 2005 16:06:41 -0000
@@ -5,7 +5,7 @@
 EE_LIB  = ../lib/libps2gdbStub.a
 EE_OBJS = ps2gdbStub.o gdb-low.o
 
-EE_CFLAGS +=   -g
+EE_CFLAGS +=   -g #-DDEBUG
 EE_LDFLAGS +=   -Wl,-Map,ps2gdbStub.map -L. -L../lib -L$(PS2SDK)/ee/lib
 
 all: $(EE_LIB)
Index: ee/ps2gdbStub.c
===================================================================
RCS file: /home/ps2cvs/ps2gdb/ee/ps2gdbStub.c,v
retrieving revision 1.5
diff -u -r1.5 ps2gdbStub.c
--- ee/ps2gdbStub.c   26 Oct 2004 09:52:36 -0000   1.5
+++ ee/ps2gdbStub.c   3 Jul 2005 16:06:45 -0000
@@ -12,6 +12,9 @@
 #include <debug.h>
 #include <ps2ip.h>
 #include <tcpip.h>
+#include <string.h>
+#include <loadfile.h>
+
 #include "gdb-stub.h"
 #include "inst.h"
 
@@ -80,6 +83,7 @@
 static int hexToInt(char **ptr, int *intValue);
 static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault);
 void handle_exception( gdb_regs_ps2 *regs );
+static int gdbstub_net_accept();
 
 // These are the gdb buffers. For the tcpip comms, there are seperate buffers, which fill input_buffer and output_buffer when
 // needed.
@@ -165,7 +169,7 @@
 struct sockaddr_in gdb_remote_addr_g;
 fd_set comms_fd_g;
 int sh_g;
-int cs_g;
+int cs_g = -1;
 int alarmid_g;
 
 // Don't want to wait around too much.
@@ -320,7 +324,12 @@
       return( gdbstub_recv_buffer_g[recvd_chars_processed++] );
    }
 
-   gdbstub_error( "Couldn't get a char\n" );
+
+   printf("Waiting for remote GDB to connect\n");
+   while (gdbstub_net_accept() == -1)
+   {
+      printf("GDB reconnect failed.\n");
+   }
 
    return 0xff;
 }
@@ -444,6 +453,9 @@
    unsigned char checksum;
    unsigned char ch;
    int count, sent_size;
+   int n;
+   int len;
+
    gdbstub_send_buffer_g[0] = '$';
    checksum = 0;
    count = 0;
@@ -460,7 +472,16 @@
    while( !gdbstub_ready_to_send() ) {
       ;
    }
-   sent_size = send( cs_g, gdbstub_send_buffer_g, count+4, 0 );
+   len = count+4;
+   sent_size = n = send(cs_g, gdbstub_send_buffer_g, len, 0);
+   // Send buffer of ps2ips (1024 Bytes) could be to small when sending all registers:
+   while (sent_size < len)
+   {
+      n = send(cs_g, &gdbstub_send_buffer_g[sent_size], len - sent_size, 0);
+      if (n <= 0)
+         break;
+      sent_size += n;
+   }
    while ((getDebugChar() & 0x7f) != '+');      // Wait for ack.
 }
 
@@ -468,6 +489,27 @@
 // has been an error. WHAT'S THIS ABOUT THEN???
 static volatile int mem_err = 0;
 
+// Convert register to hex (Print 64 bit register).
+static unsigned char *reg2hex(char *mem, char *buf, int count, int may_fault)
+{
+   unsigned char *ptr;
+   unsigned int i;
+   unsigned int j;
+
+   ptr = buf;
+
+   for (i = 0; i < count; i += 4)
+   {
+      ptr = mem2hex(&mem[i], ptr, 4, may_fault);
+      for (j = 0; j < 8; j++)
+      {
+         *ptr++ = hexchars[0];
+      }
+   }
+
+   return ptr;
+}
+
 
 // Convert the memory pointed to by mem into hex, placing result in buf.
 // Return a pointer to the last char put in buf (null), in case of mem fault, return 0.
@@ -510,6 +552,21 @@
    return buf;
 }
 
+// Copy hex to register
+static char *hex2reg(char *buf, char *mem, int count, int may_fault)
+{
+   char *ptr;
+   int i;
+
+   ptr = mem;
+
+   for (i = 0; i < count; i += 4)
+   {
+      // Only use lower 32 bit.
+      ptr = hex2mem(&buf[4*i], ptr, 4, may_fault);
+   }
+   return ptr;
+}
 
 // Writes the binary of the hex array pointed to by into mem.
 // Returns a pointer to the byte AFTER the last written.
@@ -1027,7 +1084,7 @@
    *ptr++ = hexchars[REG_EPC >> 4];
    *ptr++ = hexchars[REG_EPC & 0xf];
    *ptr++ = ':';
-   ptr = mem2hex((char *)&regs->cp0_epc, ptr, 4, 0);
+   ptr = reg2hex((char *)&regs->cp0_epc, ptr, 4, 0);
    *ptr++ = ';';
 
 #ifdef COMPILER_USES_30_AS_FP
@@ -1035,14 +1092,14 @@
    *ptr++ = hexchars[REG_FP >> 4];
    *ptr++ = hexchars[REG_FP & 0xf];
    *ptr++ = ':';
-   ptr = mem2hex((char *)&regs->reg30, ptr, 4, 0);
+   ptr = reg2hex((char *)&regs->reg30, ptr, 4, 0);
    *ptr++ = ';';
 #else
    // Send stack pointer as frame pointer instead, it's the best we can do?
    *ptr++ = hexchars[REG_FP >> 4];
    *ptr++ = hexchars[REG_FP & 0xf];
    *ptr++ = ':';
-   ptr = mem2hex((char *)&regs->reg29, ptr, 4, 0);
+   ptr = reg2hex((char *)&regs->reg29, ptr, 4, 0);
    *ptr++ = ';';
 #endif
 
@@ -1050,7 +1107,7 @@
    *ptr++ = hexchars[REG_SP >> 4];
    *ptr++ = hexchars[REG_SP & 0xf];
    *ptr++ = ':';
-   ptr = mem2hex((char *)&regs->reg29, ptr, 4, 0);
+   ptr = reg2hex((char *)&regs->reg29, ptr, 4, 0);
    *ptr++ = ';';
 
    // put the packet.
@@ -1088,12 +1145,13 @@
 
       // Return the value of the CPU registers.
       case 'g':
-         ptr = mem2hex((char *)&regs->reg0, ptr, 32*4, 0);      // r0...r31
-         ptr = mem2hex((char *)&regs->cp0_status, ptr, 6*4, 0);   // status, lo, hi, bad, cause, pc (epc!).
-         ptr = mem2hex((char *)&regs->fpr0, ptr, 32*4, 0);      // f0...31
-         ptr = mem2hex((char *)&regs->cp1_fsr, ptr, 2*4, 0);      // cp1
-         ptr = mem2hex((char *)&regs->frame_ptr, ptr, 2*4, 0);   // fp, dummy. What's dummy for?
-         ptr = mem2hex((char *)&regs->cp0_index, ptr, 16*4, 0);   // index, random, entrylo0, entrylo0 ... prid
+         ptr = reg2hex((char *)&regs->reg0, ptr, 32*4, 0);      // r0...r31
+         ptr = reg2hex((char *)&regs->cp0_status, ptr, 6*4, 0);   // status, lo, hi, bad, cause, pc (epc!).
+         ptr = reg2hex((char *)&regs->fpr0, ptr, 32*4, 0);      // f0...31
+         ptr = mem2hex((char *)&regs->cp1_fsr, ptr, 4, 0);      // cp1
+         ptr = mem2hex((char *)&regs->cp1_fir, ptr, 4, 0);      // cp1
+         /*ptr = reg2hex((char *)&regs->frame_ptr, ptr, 4, 0);   // fp, dummy. What's dummy for?
+         ptr = reg2hex((char *)&regs->cp0_index, ptr, 16*4, 0);   // index, random, entrylo0, entrylo0 ... prid*/
          break;
 
       // Set the value of the CPU registers - return OK.
@@ -1102,7 +1160,17 @@
          // TODO :: Test this, what about the SP stuff?
          ptr2 = &input_buffer[1];
          printf("DODGY G COMMAND RECIEVED\n");
-         hex2mem(ptr2, (char *)regs, 90*4, 0);               // All regs.
+         //hex2reg(ptr2, (char *)regs, 90*4, 0);               // All regs.
+         hex2reg(ptr2, (char *)&regs->reg0, 32*4, 0);
+         ptr2 = &ptr2[32*16];
+         hex2reg(ptr2, (char *)&regs->cp0_status, 6*4, 0);
+         ptr2 = &ptr2[6*16];
+         hex2reg(ptr2, (char *)&regs->fpr0, 32*4, 0);
+         ptr2 = &ptr2[32*16];
+         hex2mem(ptr2, (char *)&regs->cp1_fsr, 4, 0);
+         ptr2 = &ptr2[1*8];
+         hex2mem(ptr2, (char *)&regs->cp1_fir, 4, 0);
+         ptr2 = &ptr2[1*8];
          // Not sure about this part, so I'm not doing it.
          // See if the stack pointer has moved. If so, then copy the saved locals and ins to the new location.
          // newsp = (unsigned long *)registers[SP];
@@ -1276,7 +1344,7 @@
 // -1 == failure
 int gdbstub_net_open()
 {
-   int remote_len, tmp;
+   int tmp;
    int rc_bind, rc_listen;
 
    if( SifLoadModule(HOSTPATHIRX "ps2ips.irx", 0, NULL) < 0 ) {
@@ -1321,8 +1389,18 @@
       return -1;
    }
    gdbstub_printf( DEBUG_COMMSINIT, "Listen returned %i.\n", rc_listen );
+   return 0;
+}
+
+static int gdbstub_net_accept()
+{
+   int remote_len;
+   int tmp;
 
    remote_len = sizeof( gdb_remote_addr_g );
+   // Disconnect last connection if there was any.
+   if (cs_g >= 0)
+      disconnect(cs_g);
    cs_g = accept( sh_g, (struct sockaddr *)&gdb_remote_addr_g, &remote_len );
 
    if ( cs_g < 0 ) {
@@ -1345,7 +1423,6 @@
    return 0;
 }
 
-
 void gdbstub_net_close()
 {
    disconnect( cs_g );
@@ -1365,7 +1442,8 @@
    gdbstub_num_exceptions_g = 0;
    thread_id_g = GetThreadId();
 
-   if( gdbstub_net_open() == -1 ) {
+   if( gdbstub_net_open() == -1
+      || gdbstub_net_accept() == -1) {
       gdbstub_error("failed to open net connection.\n");
       return -1;
    }
@@ -1434,4 +1512,5 @@
       ExitDeleteThread();
       return -1;
    }
+   return 0;
 }


The advantage of the patch is, that it works with an unpatched gdb. I also added some improvements, e.g. big messages couldn't be send correctly.
I don't tested it with the current version of ps2gdb, but I think ps2gdb doesn't change.

To connect use the following commands in gdb:

set endian little
target remote 192.168.1.23:12

Don't forget to add "gdb_stub_main(argc, argv);" to your application to activate it.
Back to top
View user's profile Send private message Visit poster's website
RandomZero



Joined: 23 Dec 2005
Posts: 2

PostPosted: Thu Jan 19, 2006 8:58 pm    Post subject: Reply with quote

Thanks - nice patch. :)
Back to top
View user's profile Send private message
tumnes



Joined: 17 Sep 2004
Posts: 23

PostPosted: Thu Jan 22, 2009 4:22 pm    Post subject: Reply with quote

Mega Man wrote:

...

and the following patch for ps2gdb (this patch uses 32 Bits for all registers):

...


If this is the preferred way to do this, is there any reason this patch has not been submitted to the trunk?
Back to top
View user's profile Send private message Visit poster's website AIM Address
cosmito



Joined: 04 Mar 2007
Posts: 314
Location: Portugal

PostPosted: Thu Jan 22, 2009 9:05 pm    Post subject: Reply with quote

Check also the thread
http://forums.ps2dev.org/viewtopic.php?t=11075

where I applied Megaman's patch and experimented with ps2gdb.
There were some issues regarding exceptions but I managed to get it working.

What would nice now would be a gdb GUI or use Eclipse integrated support (it's already being used with pspsdk - there are some threads about it).
Back to top
View user's profile Send private message Visit poster's website
raema



Joined: 26 Jan 2010
Posts: 5

PostPosted: Tue Feb 02, 2010 7:05 pm    Post subject: Reply with quote

Hello Cosmito, are you still there ... ?

What is the status of your patches on ps2gdb ?

Does it still work with the latest ps2sdk ?
Back to top
View user's profile Send private message
cosmito



Joined: 04 Mar 2007
Posts: 314
Location: Portugal

PostPosted: Mon Feb 08, 2010 2:57 am    Post subject: Reply with quote

raema wrote:
Hello Cosmito, are you still there ... ?

What is the status of your patches on ps2gdb ?

Does it still work with the latest ps2sdk ?

Hi,

I haven't done no more modifications since the last. I sort of gave up using gdb since it's too little user-friendly and very slow due to the network performance of the TCP stack. Unfortunably there's no better alternative...
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PS2 Development All times are GMT + 10 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group