Questions on RTEMS GDB stub over a serial line

Joel Sherrill joel.sherrill at oarcorp.com
Tue Nov 27 16:53:19 UTC 2007


Till Straumann wrote:
> 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
>   
FWIW at Eric Norum's suggestion, I just added
CONFIGURE_APPLICATION_EXTRA_DRIVERS to CVS head and 4.8.
This lets you insert driver entries at the end of the table.
Not a big deal but it should reduce the number of reasons to
write your own driver table.
> 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
>>   
>>     
>
>
> _______________________________________________
> rtems-users mailing list
> rtems-users at rtems.com
> http://rtems.rtems.org/mailman/listinfo/rtems-users
>   




More information about the users mailing list