|
forums.ps2dev.org Homebrew PS2, PSP & PS3 Development Discussions
|
View previous topic :: View next topic |
Author |
Message |
RandomZero
Joined: 23 Dec 2005 Posts: 2
|
Posted: Fri Dec 23, 2005 4:30 pm Post subject: GDB on PS2 |
|
|
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 |
|
|
Drakonite Site Admin
Joined: 17 Jan 2004 Posts: 989
|
Posted: Sat Dec 24, 2005 2:01 am Post subject: |
|
|
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 |
|
|
Mega Man
Joined: 18 Jun 2005 Posts: 274
|
Posted: Sun Jan 01, 2006 1:51 am Post subject: |
|
|
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 *)®s->cp0_epc, ptr, 4, 0);
+ ptr = reg2hex((char *)®s->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 *)®s->reg30, ptr, 4, 0);
+ ptr = reg2hex((char *)®s->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 *)®s->reg29, ptr, 4, 0);
+ ptr = reg2hex((char *)®s->reg29, ptr, 4, 0);
*ptr++ = ';';
#endif
@@ -1050,7 +1107,7 @@
*ptr++ = hexchars[REG_SP >> 4];
*ptr++ = hexchars[REG_SP & 0xf];
*ptr++ = ':';
- ptr = mem2hex((char *)®s->reg29, ptr, 4, 0);
+ ptr = reg2hex((char *)®s->reg29, ptr, 4, 0);
*ptr++ = ';';
// put the packet.
@@ -1088,12 +1145,13 @@
// Return the value of the CPU registers.
case 'g':
- ptr = mem2hex((char *)®s->reg0, ptr, 32*4, 0); // r0...r31
- ptr = mem2hex((char *)®s->cp0_status, ptr, 6*4, 0); // status, lo, hi, bad, cause, pc (epc!).
- ptr = mem2hex((char *)®s->fpr0, ptr, 32*4, 0); // f0...31
- ptr = mem2hex((char *)®s->cp1_fsr, ptr, 2*4, 0); // cp1
- ptr = mem2hex((char *)®s->frame_ptr, ptr, 2*4, 0); // fp, dummy. What's dummy for?
- ptr = mem2hex((char *)®s->cp0_index, ptr, 16*4, 0); // index, random, entrylo0, entrylo0 ... prid
+ ptr = reg2hex((char *)®s->reg0, ptr, 32*4, 0); // r0...r31
+ ptr = reg2hex((char *)®s->cp0_status, ptr, 6*4, 0); // status, lo, hi, bad, cause, pc (epc!).
+ ptr = reg2hex((char *)®s->fpr0, ptr, 32*4, 0); // f0...31
+ ptr = mem2hex((char *)®s->cp1_fsr, ptr, 4, 0); // cp1
+ ptr = mem2hex((char *)®s->cp1_fir, ptr, 4, 0); // cp1
+ /*ptr = reg2hex((char *)®s->frame_ptr, ptr, 4, 0); // fp, dummy. What's dummy for?
+ ptr = reg2hex((char *)®s->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 *)®s->reg0, 32*4, 0);
+ ptr2 = &ptr2[32*16];
+ hex2reg(ptr2, (char *)®s->cp0_status, 6*4, 0);
+ ptr2 = &ptr2[6*16];
+ hex2reg(ptr2, (char *)®s->fpr0, 32*4, 0);
+ ptr2 = &ptr2[32*16];
+ hex2mem(ptr2, (char *)®s->cp1_fsr, 4, 0);
+ ptr2 = &ptr2[1*8];
+ hex2mem(ptr2, (char *)®s->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 |
|
|
RandomZero
Joined: 23 Dec 2005 Posts: 2
|
Posted: Thu Jan 19, 2006 8:58 pm Post subject: |
|
|
Thanks - nice patch. :) |
|
Back to top |
|
|
tumnes
Joined: 17 Sep 2004 Posts: 23
|
Posted: Thu Jan 22, 2009 4:22 pm Post subject: |
|
|
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 |
|
|
cosmito
Joined: 04 Mar 2007 Posts: 314 Location: Portugal
|
Posted: Thu Jan 22, 2009 9:05 pm Post subject: |
|
|
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 |
|
|
raema
Joined: 26 Jan 2010 Posts: 5
|
Posted: Tue Feb 02, 2010 7:05 pm Post subject: |
|
|
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 |
|
|
cosmito
Joined: 04 Mar 2007 Posts: 314 Location: Portugal
|
Posted: Mon Feb 08, 2010 2:57 am Post subject: |
|
|
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 |
|
|
|
|
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
|