Questions on RTEMS GDB stub over a serial line
Till Straumann
strauman at slac.stanford.edu
Tue Nov 27 16:45:51 UTC 2007
Ian Jiang wrote:
> Hi rtems-usersall!
>
> I am establishing a remote debug enviroment of RTEMS in a VMware workstation. I am using Till Straumann's GDB Agent for RTEMS. I referred http://www.slac.stanford.edu/~strauman/rtems/gdb/ but I am not clear enough about how to setup a session between the host and the target using a serial port.
>
> Questions
> =========
>
> 1) Where is the serial device?
> Some codes were added to list all file under /dev/ but only /dev/console was found.
>
You'd have to add 'TTY1_DRIVER_TABLE_ENTRY' to the driver table.
Since this driver is unkown to confdefs.h you would have to
#define CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
and add a device driver table, see e.g, cpukit/pppd/example/system.h
BTW: AFAIK, hello normally uses a minimal configuration w/o a
clock driver but the gdb stub probably won't work w/o a clock.
Thus, make sure you add CLOCK_DRIVER_TABLE_ENTRY to
the device driver table.
> 2) Is my test program correct?
> The source codes are attached at last.
>
I believe the tty driver creates file-system entries /dev/ttyS1 (and
/dev/ttyS2
if the second device is configured). Hence, you'd have to call
rtems_gdb_start(0, "/dev/ttyS1")
Also, you might want to insert a breakpoint - otherwise
your application executes to the end before you have a chance
to attach the debugger and interrupt the program.
Just call
rtems_gdb_breakpoint()
(anywhere after rtems_gdb_start())
> 3) Why no debugging symbols found in the hello.exe although flag -g was used?
>
Has been answered already; you want to use 'hello.nxe'.
HTH
-- Till
(PS: could you get the network driver working? I still have to look
at the binaries you sent -- just haven't found the time yet, sorry)
> ian at IanVM-1:~/src/examples-4.7.1/hello4gdb> /opt/gdb-6.5/i386-rtems-gdb
> GNU gdb 6.5
> Copyright (C) 2006 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "--host=i686-pc-linux-gnu --target=i386-ssrl-rtems".
> (gdb) file ./o-optimize/hello.exe
> Reading symbols from /home/ian/src/examples-4.7.1/hello4gdb/o-optimize/hello.exe...(no debugging symbols found)...done.
>
>
>
> More Information
> ================
>
> -------------------
> RTEMS Configuration
> -------------------
> My host is Suse-10.1 with RTEMS-4.7.1 that configured as
> ian at IanVM-1:~/rtems/b-rtems_debug> ../../src/rtems-4.7.1/configure --target=i386-rtems4.7 --quiet --enable-posix --enable-networking --enable-cxx --enable-rtemsbsp=pc386 --enable-rdbg --prefix=/home/ian/rtems/rtems_debug-4.7.1 CFLAGS=-fno-strict-aliasing
>
>
> ----------------
> GDB and the Stub
> ----------------
> I installed GDB 6.5 with patches of GDB stub for RTEMS 1.4(http://www.slac.stanford.edu/~strauman/rtems/gdb/RTEMS_gdb_stub_1_4.tgz) and the GDB stub for RTEMS without using Cexp or libbspext.
> I also installed libbspExt-1.3beta and "bsd_eth_drivers" from Till , because they were required while building my simple hello-world test.
>
>
> -----------------------------
> About the two Vitual Machines
> -----------------------------
> One is the host that has RTEMS developing tools, the other is the target where RTEMS hello-world runs. They are connected with a serial line (a virtual line provided by the VMware workstation).
>
>
> -------------------
> Output of hello.exe
> -------------------
> Initialized console on port CONSOLE
>
> List of dir /:
> name inode offset reclen type
> dev 2 0 268i
> List of dir /dev/:
> name inode offset reclen type
> console 8 0 268i
> Task App Enter
> GDB daemon (Release $Name: RTEMS_gdb_stub_1_4 $): starting up
>
> *** HELLO WORLD TEST ***
> Hello World
> *** END OF HELLO WORLD TEST ***
> Task App Exit
> GDB daemon - opening tty: No such file or directory
> GDB daemon: shutting down
>
>
> ------------------------
> Souce Codes of hello.exe
> ------------------------
>
>
> ian at IanVM-1:~/src/examples-4.7.1/hello4gdb> cat test.c
> -------------------------------------------------------
> /*
> * Simple test program -- simplified version of sample test hello.
> */
>
> #define TEST_INIT
> #include <tmacros.h>
>
> #include <bsp.h>
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <sys/types.h>
> #include <fcntl.h>
> #include <dirent.h>
> #include <errno.h>
> #include <string.h>
>
> #include <rtems/rtems_bsdnet.h>
> #include <rtems-gdb-stub.h>
> #include <bsp/bspExt.h>
>
> #include "networkconfig.h"
>
> #define TASK_PRIORITY_APP 4
>
> void printdir(char *dir_name)
> {
> struct dirent *d;
> DIR *dir;
>
> if (dir_name == NULL) {
> printf("NULL dir name\n");
> return;
> }
>
> dir = opendir(dir_name);
> if (dir == NULL) {
> printf("open dir %s failed:%s\n", dir_name, strerror(errno));
> return;
> }
>
> printf("List of dir %s:\n", dir_name);
> printf( "%-20s %8s %8s %8s %4s\n",
> "name", " inode", " offset", "reclen", " type" );
> d = readdir(dir);
>
> while (d) {
> printf( "%-20s %8d %8d %6di\n",
> d->d_name, (int)d->d_ino, (int)d->d_off, d->d_reclen);
> d = readdir(dir);
> }
>
> return;
> }
>
>
> rtems_task
> app_task (rtems_task_argument ignored)
> {
> rtems_status_code ret;
>
> printf("Task App Enter\n");
>
>
> rtems_gdb_start(0, "/dev/ttyS0");
>
> printf( "\n\n*** HELLO WORLD TEST ***\n" );
> printf( "Hello World\n" );
> printf( "*** END OF HELLO WORLD TEST ***\n" );
>
> /* delete myself and exit */
> printf("Task App Exit\n");
> ret = rtems_task_delete(RTEMS_SELF);
> directive_failed(ret, "Delete task App");
> }
>
> rtems_task Init(
> rtems_task_argument ignored
> )
> {
> rtems_name app_name;
> rtems_id app_id;
> rtems_status_code ret;
>
> printdir("/");
> printdir("/dev/");
>
> /* create and start application task */
> app_name = rtems_build_name('a', 'p', 'p', '0');
> ret = rtems_task_create(app_name,
> TASK_PRIORITY_APP,
> RTEMS_MINIMUM_STACK_SIZE,
> RTEMS_DEFAULT_MODES,
> RTEMS_DEFAULT_ATTRIBUTES,
> &app_id);
> directive_failed(ret, "Create task App");
>
> ret = rtems_task_start(app_id, app_task, 0);
> directive_failed(ret, "Start task App");
>
> /* delete myself and exit */
> ret = rtems_task_delete(RTEMS_SELF);
> directive_failed(ret, "Delete task Init");
> }
>
> /* configuration information */
>
> #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
> #define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 20
> #define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
> #define CONFIGURE_MAXIMUM_TASKS 4
> #define CONFIGURE_EXECUTIVE_RAM_SIZE (512*1024)
>
> #define CONFIGURE_INIT
>
> #include <rtems/confdefs.h>
>
> /* end of file */
>
>
> ian at IanVM-1:~/src/examples-4.7.1/hello4gdb> cat Makefile
> --------------------------------------------------------
> #
> # $Id: Makefile,v 1.4 1998/08/21 13:26:05 joel Exp $
> #
>
> SAMPLE=hello
> PGM=${ARCH}/$(SAMPLE).exe
>
> MANAGERS=all
>
> # C source names, if any, go here -- minus the .c
> C_PIECES= test
> C_FILES=$(C_PIECES:%=%.c)
> C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
>
> H_FILES=
>
> DOCTYPES=
> DOCS=$(DOCTYPES:%=$(SAMPLE).%)
>
> SRCS=$(DOCS) $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
> OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
>
> PRINT_SRCS=$(DOCS)
>
> PGM=${ARCH}/$(SAMPLE).exe
>
> include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
> include $(RTEMS_CUSTOM)
> include $(PROJECT_ROOT)/make/leaf.cfg
>
> #
> # (OPTIONAL) Add local stuff here using +=
> #
>
> DEFINES +=
> CPPFLAGS +=
> CFLAGS_LD += -Wl,--defsym -Wl,HeapSize=0xC0000
> CFLAGS_OPTIMIZE_V +=
> CFLAGS_DEBUG_V += -v -qrtems_debug
>
> CFLAGS_LD += -g
>
>
> CFLAGS += -fno-strict-aliasing -O
> CFLAGS += -I${RTEMS_MAKEFILE_PATH}/include
> CFLAGS += -I/home/ian/src/examples-4.7.1/test_includes
> CFLAGS += -g
> CFLAGS += -Wall
>
> #OP_SYS_LDFLAGS = -g
>
> LD_PATHS += -L${RTEMS_MAKEFILE_PATH}/lib
> #LD_LIBS += -lif_le -lbsdport -lbspExt
> LD_LIBS += -lrtems-gdb-stub -lif_le -lbsdport -lbspExt
> #LD_LIBS += -lrtems-gdb-stub
> LIBS += -lrtemsall -lc
>
> #
> # Add your list of files to delete here. The config files
> # already know how to delete some stuff, so you may want
> # to just run 'make clean' first to see what gets missed.
> # 'make clobber' already includes 'make clean'
> #
>
> CLEAN_ADDITIONS +=
> CLOBBER_ADDITIONS +=
>
> all: ${ARCH} $(SRCS) $(PGM)
>
> ${PGM}: $(OBJS) $(LINK_FILES)
> $(make-exe)
>
> # Install the program(s), appending _g or _p as appropriate.
> # for include files, just use $(INSTALL)
> install: all
> $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
>
>
> ian at IanVM-1:~/src/examples-4.7.1/hello4gdb> cat networkconfig.h
> ---------------------------------------------------------------
> /*
> * Network configuration
> *
> ************************************************************
> * EDIT THIS FILE TO REFLECT YOUR NETWORK CONFIGURATION *
> * BEFORE RUNNING ANY RTEMS PROGRAMS WHICH USE THE NETWORK! *
> ************************************************************
> *
> * $Id: networkconfig.h,v 1.8 2001/08/31 18:11:43 joel Exp $
> */
>
> #ifndef _RTEMS_NETWORKCONFIG_H_
> #define _RTEMS_NETWORKCONFIG_H_
>
> //#define USE_QEMU
>
>
> /*
> * The following will normally be set by the BSP if it supports
> * a single network device driver. In the event, it supports
> * multiple network device drivers, then the user's default
> * network device driver will have to be selected by a BSP
> * specific mechanism.
> */
>
> #ifdef RTEMS_BSP_NETWORK_DRIVER_NAME
> #undef RTEMS_BSP_NETWORK_DRIVER_NAME
> #endif
> #ifdef USE_QEMU
> #define RTEMS_BSP_NETWORK_DRIVER_NAME BSP_NE2000_NETWORK_DRIVER_NAME
> #else
> #define RTEMS_BSP_NETWORK_DRIVER_NAME "le1"
> #endif
>
>
>
> #ifdef RTEMS_BSP_NETWORK_DRIVER_ATTACH
> #undef RTEMS_BSP_NETWORK_DRIVER_ATTACH
> #endif
>
> #ifdef USE_QEMU
> #define RTEMS_BSP_NETWORK_DRIVER_ATTACH BSP_NE2000_NETWORK_DRIVER_ATTACH
> #else
> #define RTEMS_BSP_NETWORK_DRIVER_ATTACH libbsdport_netdriver_attach
> #endif
>
> #include <rtems/pci.h>
> #include <rtems/irq.h>
>
> #ifndef USE_QEMU
> #include <bsp/libbsdport_api.h>
> extern driver_t libbsdport_le_pci_driver;
>
> driver_t *libbsdport_netdriver_table[] = {
> &libbsdport_le_pci_driver,
> /* other drivers here or upstream of 'le' if they support
> * the same hardware but are preferred.
> */
> 0
> };
> #endif
>
> /* #define RTEMS_USE_BOOTP */
>
> #include <bsp.h>
>
> /*
> * Define RTEMS_SET_ETHERNET_ADDRESS if you want to specify the
> * Ethernet address here. If RTEMS_SET_ETHERNET_ADDRESS is not
> * defined the driver will choose an address.
> */
> #ifndef USE_QEMU
> #define RTEMS_SET_ETHERNET_ADDRESS
> #endif
> #if (defined (RTEMS_SET_ETHERNET_ADDRESS))
> /* static char ethernet_address[6] = { 0x08, 0x00, 0x3e, 0x12, 0x28, 0xb1 }; */
> static char ethernet_address[6] = { 0x00, 0x80, 0x7F, 0x22, 0x61, 0x77 };
>
> #endif
>
> #ifdef RTEMS_USE_LOOPBACK
> /*
> * Loopback interface
> */
> extern void rtems_bsdnet_loopattach();
> static struct rtems_bsdnet_ifconfig loopback_config = {
> "lo0", /* name */
> rtems_bsdnet_loopattach, /* attach function */
>
> NULL, /* link to next interface */
>
> "127.0.0.1", /* IP address */
> "255.0.0.0", /* IP net mask */
> };
> #endif
>
>
> /*
> * Default network interface
> */
> static struct rtems_bsdnet_ifconfig netdriver_config = {
> RTEMS_BSP_NETWORK_DRIVER_NAME, /* name */
> RTEMS_BSP_NETWORK_DRIVER_ATTACH, /* attach function */
>
>
> #ifdef RTEMS_USE_LOOPBACK
> &loopback_config, /* link to next interface */
> #else
> NULL, /* No more interfaces */
> #endif
>
> #if (defined (RTEMS_USE_BOOTP))
> NULL, /* BOOTP supplies IP address */
> NULL, /* BOOTP supplies IP net mask */
> #else
> //"XXX.YYY.ZZZ.XYZ", /* IP address */
>
> #ifdef USE_QEMU
> "192.168.10.230", /* IP address */
> #else
> "192.168.1.230", /* IP address */
> #endif
>
> "255.255.255.0", /* IP net mask */
> #endif /* !RTEMS_USE_BOOTP */
>
> #if (defined (RTEMS_SET_ETHERNET_ADDRESS))
> ethernet_address, /* Ethernet hardware address */
> #else
> NULL, /* Driver supplies hardware address */
> #endif
>
>
> #ifndef USE_QEMU
> 0 /* Use default driver parameters */
> #else
> 0, /* Use default driver parameters */
> 0,
> 0,
> 0,
>
> 0x300,
> 9,
> 0
> #endif
> };
>
> /*
> * Network configuration
> */
> struct rtems_bsdnet_config rtems_bsdnet_config = {
> &netdriver_config,
>
> #if (defined (RTEMS_USE_BOOTP))
> rtems_bsdnet_do_bootp,
> #else
> NULL,
> #endif
>
> 0, /* Default network task priority */
> 0, /* Default mbuf capacity */
> 0, /* Default mbuf cluster capacity */
>
> #if (!defined (RTEMS_USE_BOOTP))
> "IanVM-N0", /* Host name */
> "nodomain.com", /* Domain name */
> "192.168.1.254", /* Gateway */
> "192.168.1.241", /* Log host */
> {"192.168.1.106" }, /* Name server(s) */
> {"192.168.1.241" }, /* NTP server(s) */
>
> /*
> * A real example -- DO NOT USE THIS YOURSELF!!!
> */
>
> #if 0
> "dy4", /* Host name */
> "NOT_oarcorp.com", /* Domain name */
> "192.168.1.2", /* Gateway */
> "192.168.1.2", /* Log host */
> {"192.168.1.2" }, /* Name server(s) */
> {"192.168.1.2" }, /* NTP server(s) */
> #endif
> #endif /* !RTEMS_USE_BOOTP */
>
> };
>
> /*
> * For TFTP test application
> */
> #if (defined (RTEMS_USE_BOOTP))
> #define RTEMS_TFTP_TEST_HOST_NAME "BOOTP_HOST"
> #define RTEMS_TFTP_TEST_FILE_NAME "BOOTP_FILE"
> #else
> #define RTEMS_TFTP_TEST_HOST_NAME "XXX.YYY.ZZZ.XYZ"
> #define RTEMS_TFTP_TEST_FILE_NAME "tftptest"
> #endif
>
> #endif /* _RTEMS_NETWORKCONFIG_H_ */
>
>
>
>
>
>
>
> --------------
> Ian Jiang
> ianjiang.cn at gmail.com
> 2007-11-27 20:09:23
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users
>
More information about the users
mailing list