1999-04-16 01:35:26 +00:00
|
|
|
/* Replay a remote debug session logfile for GDB.
|
2015-01-01 09:32:14 +00:00
|
|
|
Copyright (C) 1996-2015 Free Software Foundation, Inc.
|
1999-04-16 01:35:26 +00:00
|
|
|
Written by Fred Fish (fnf@cygnus.com) from pieces of gdbserver.
|
|
|
|
|
1999-07-07 20:19:36 +00:00
|
|
|
This file is part of GDB.
|
1999-04-16 01:35:26 +00:00
|
|
|
|
1999-07-07 20:19:36 +00:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-08-23 18:08:50 +00:00
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
1999-07-07 20:19:36 +00:00
|
|
|
(at your option) any later version.
|
1999-04-16 01:35:26 +00:00
|
|
|
|
1999-07-07 20:19:36 +00:00
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
1999-04-16 01:35:26 +00:00
|
|
|
|
1999-07-07 20:19:36 +00:00
|
|
|
You should have received a copy of the GNU General Public License
|
2007-08-23 18:08:50 +00:00
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
1999-04-16 01:35:26 +00:00
|
|
|
|
1999-11-02 04:44:47 +00:00
|
|
|
#include "config.h"
|
2012-08-22 20:04:05 +00:00
|
|
|
#include "build-gnulib-gdbserver/config.h"
|
don't keep a gdb-specific date
Right now there are two nightly commits to update a file in the tree
with the current date. One commit is for BFD, one is for gdb.
It seems unnecessary to me to do this twice. We can make do with a
single such commit.
This patch changes gdb in a minimal way to reuse the BFD date -- it
extracts it from bfd/version.h and changes version.in to use the
placeholder string "DATE" for those times when a date is wanted.
I propose removing the cron job that updates the version on trunk, and
then check in this patch.
For release branches, we can keep the cron job, but just tell it to
rewrite bfd/version.h. I believe this is a simple change in the
crontab -- the script will work just fine on this file.
This also moves version.in and version.h into common/, to reflect
their shared status; and updates gdbserver to use version.h besides.
* common/create-version.sh: New file.
* Makefile.in (version.c): Use bfd/version.h, common/version.in,
create-version.sh.
(HFILES_NO_SRCDIR): Use common/version.h.
* version.in: Move to ...
* common/version.in: ... here. Replace date with "DATE".
* version.h: Move to ...
* common/version.h: ... here.
gdbserver:
* Makefile.in (version.c): Use bfd/version.h, common/version.in,
create-version.sh.
(version.o): Remove.
* gdbreplay.c: Include version.h.
(version, host_name): Don't declare.
* server.h: Include version.h.
(version, host_name): Don't declare.
doc:
* Makefile.in (POD2MAN1, POD2MAN5): Use version.subst.
(GDBvn.texi): Use version.subst.
(version.subst): New target.
(mostlyclean): Remove version.subst.
2013-06-24 15:06:27 +00:00
|
|
|
#include "version.h"
|
2012-08-22 20:04:05 +00:00
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
#include <stdio.h>
|
gdb/
* arm-wince-tdep.c: New.
* config/arm/wince.mt (DEPRECATED_TM_FILE): Use tm-arm.h.
(MT_CFLAGS): Delete.
(TM_CLIBS): Delete.
(TDEPFILES): Add arm-wince-tdep.o, corelow.o, solib.o,
solib-legacy.o, solib-svr4.o, and remove wince.o.
* configure.tgt (arm*-*-mingw32ce*): Add.
* signals/signals.c [HAVE_SIGNAL_H]: Check.
(do_target_signal_to_host): Silence 'not used' warning.
* config/arm/tm-wince.h: Remove.
gdb/gdbserver/
* gdbserver/configure.ac: Add errno checking.
(AC_CHECK_HEADERS): Add errno.h, fcntl.h, signal.h,
sys/file.h and malloc.h.
(AC_CHECK_DECLS): Add perror.
(srv_mingwce): Handle.
* gdbserver/configure.srv (i[34567]86-*-cygwin*): Add
win32-i386-low.o to srv_tgtobj.
(i[34567]86-*-mingw*): Likewise.
(arm*-*-mingw32ce*): Add case.
* gdbreplay.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_ERRNO_H, HAVE_MALLOC_H]: Check.
[__MINGW32CE__] (strerror): New function.
[__MINGW32CE__] (errno): Define to GetLastError.
[__MINGW32CE__] (COUNTOF): New macro.
(remote_open): Remove extra close call.
* mem-break.c (delete_breakpoint_at): New function.
* mem-break.h (delete_breakpoint_at): Declare.
* remote-utils.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_UNISTD_H, HAVE_ERRNO_H]: Check.
[USE_WIN32API] (read, write): Add char* casts.
* server.c [HAVE_UNISTD_H, HAVE_SIGNAL_H]: Check.
* server.h: Include wincecompat.h on Windows CE.
[HAVE_ERRNO_H]: Check.
(perror): Declare if not declared.
* utils.c: Add stdlib.h, errno.h and malloc.h includes.
(perror_with_name): Remove errno declaration.
* wincecompat.h: New.
* wincecompat.c: New.
* win32-low.h: New.
* win32-arm-low.c: New.
* win32-i386-low.c: New.
(win32-low.c): Include mem-break.h and win32-low.h, and winnt.h.
(OUTMSG2): Make it safe.
(_T): New macro.
(COUNTOF): New macro.
(NUM_REGS): Get it from the low target.
(CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT,
CONTEXT_DEBUG_REGISTERS): Add fallbacks to 0.
(thread_rec): Let low target handle debug registers.
(child_add_thread): Likewise.
(child_init_thread_list): Likewise.
(continue_one_thread): Likewise.
(regptr): New.
(do_child_fetch_inferior_registers): Move to ...
* win32-i386-low.c: ... here, and rename to ...
(do_fetch_inferior_registers): ... this.
* win32-low.c (child_fetch_inferior_registers):
Go through the low target.
(do_child_store_inferior_registers): Use regptr.
(strwinerror): New function.
(win32_create_inferior): Handle Windows CE.
Use strwinerror instead of strerror on Windows error
codes. Add program to the error output.
Don't close the main thread handle on Windows CE.
(win32_attach): Use coredll.dll on Windows CE.
(win32_kill): Close current process and current
thread handles.
(win32_detach): Use coredll.dll on Windows CE.
(win32_resume): Let low target handle debug registers, and
step request.
(handle_exception): Add/Remove initial breakpoint. Avoid
non-existant WSTOPSIG on Windows CE.
(win32_read_inferior_memory): Cast to remove warning.
(win32_arch_string): Go through the low target.
(initialize_low): Call set_breakpoint_data with the low
target's breakpoint.
* win32-low.c (dr, FLAG_TRACE_BIT, FCS_REGNUM,
FOP_REGNUM, mappings): Move to ...
* win32-i386-low.c: ... here.
* win32-low.c (win32_thread_info): Move to ...
* win32-low.h: ... here.
* Makefile.in (SFILES): Add win32-low.c, win32-i386-low.c,
win32-arm-low.c and wincecompat.c.
(all:): Add $EXEEXT.
(install-only:): Likewise.
(gdbserver:): Likewise.
(gdbreplay:): Likewise.
* config.in: Regenerate.
* configure: Regenerate.
2007-03-29 01:06:48 +00:00
|
|
|
#if HAVE_SYS_FILE_H
|
1999-04-16 01:35:26 +00:00
|
|
|
#include <sys/file.h>
|
gdb/
* arm-wince-tdep.c: New.
* config/arm/wince.mt (DEPRECATED_TM_FILE): Use tm-arm.h.
(MT_CFLAGS): Delete.
(TM_CLIBS): Delete.
(TDEPFILES): Add arm-wince-tdep.o, corelow.o, solib.o,
solib-legacy.o, solib-svr4.o, and remove wince.o.
* configure.tgt (arm*-*-mingw32ce*): Add.
* signals/signals.c [HAVE_SIGNAL_H]: Check.
(do_target_signal_to_host): Silence 'not used' warning.
* config/arm/tm-wince.h: Remove.
gdb/gdbserver/
* gdbserver/configure.ac: Add errno checking.
(AC_CHECK_HEADERS): Add errno.h, fcntl.h, signal.h,
sys/file.h and malloc.h.
(AC_CHECK_DECLS): Add perror.
(srv_mingwce): Handle.
* gdbserver/configure.srv (i[34567]86-*-cygwin*): Add
win32-i386-low.o to srv_tgtobj.
(i[34567]86-*-mingw*): Likewise.
(arm*-*-mingw32ce*): Add case.
* gdbreplay.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_ERRNO_H, HAVE_MALLOC_H]: Check.
[__MINGW32CE__] (strerror): New function.
[__MINGW32CE__] (errno): Define to GetLastError.
[__MINGW32CE__] (COUNTOF): New macro.
(remote_open): Remove extra close call.
* mem-break.c (delete_breakpoint_at): New function.
* mem-break.h (delete_breakpoint_at): Declare.
* remote-utils.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_UNISTD_H, HAVE_ERRNO_H]: Check.
[USE_WIN32API] (read, write): Add char* casts.
* server.c [HAVE_UNISTD_H, HAVE_SIGNAL_H]: Check.
* server.h: Include wincecompat.h on Windows CE.
[HAVE_ERRNO_H]: Check.
(perror): Declare if not declared.
* utils.c: Add stdlib.h, errno.h and malloc.h includes.
(perror_with_name): Remove errno declaration.
* wincecompat.h: New.
* wincecompat.c: New.
* win32-low.h: New.
* win32-arm-low.c: New.
* win32-i386-low.c: New.
(win32-low.c): Include mem-break.h and win32-low.h, and winnt.h.
(OUTMSG2): Make it safe.
(_T): New macro.
(COUNTOF): New macro.
(NUM_REGS): Get it from the low target.
(CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT,
CONTEXT_DEBUG_REGISTERS): Add fallbacks to 0.
(thread_rec): Let low target handle debug registers.
(child_add_thread): Likewise.
(child_init_thread_list): Likewise.
(continue_one_thread): Likewise.
(regptr): New.
(do_child_fetch_inferior_registers): Move to ...
* win32-i386-low.c: ... here, and rename to ...
(do_fetch_inferior_registers): ... this.
* win32-low.c (child_fetch_inferior_registers):
Go through the low target.
(do_child_store_inferior_registers): Use regptr.
(strwinerror): New function.
(win32_create_inferior): Handle Windows CE.
Use strwinerror instead of strerror on Windows error
codes. Add program to the error output.
Don't close the main thread handle on Windows CE.
(win32_attach): Use coredll.dll on Windows CE.
(win32_kill): Close current process and current
thread handles.
(win32_detach): Use coredll.dll on Windows CE.
(win32_resume): Let low target handle debug registers, and
step request.
(handle_exception): Add/Remove initial breakpoint. Avoid
non-existant WSTOPSIG on Windows CE.
(win32_read_inferior_memory): Cast to remove warning.
(win32_arch_string): Go through the low target.
(initialize_low): Call set_breakpoint_data with the low
target's breakpoint.
* win32-low.c (dr, FLAG_TRACE_BIT, FCS_REGNUM,
FOP_REGNUM, mappings): Move to ...
* win32-i386-low.c: ... here.
* win32-low.c (win32_thread_info): Move to ...
* win32-low.h: ... here.
* Makefile.in (SFILES): Add win32-low.c, win32-i386-low.c,
win32-arm-low.c and wincecompat.c.
(all:): Add $EXEEXT.
(install-only:): Likewise.
(gdbserver:): Likewise.
(gdbreplay:): Likewise.
* config.in: Regenerate.
* configure: Regenerate.
2007-03-29 01:06:48 +00:00
|
|
|
#endif
|
|
|
|
#if HAVE_SIGNAL_H
|
1999-04-16 01:35:26 +00:00
|
|
|
#include <signal.h>
|
gdb/
* arm-wince-tdep.c: New.
* config/arm/wince.mt (DEPRECATED_TM_FILE): Use tm-arm.h.
(MT_CFLAGS): Delete.
(TM_CLIBS): Delete.
(TDEPFILES): Add arm-wince-tdep.o, corelow.o, solib.o,
solib-legacy.o, solib-svr4.o, and remove wince.o.
* configure.tgt (arm*-*-mingw32ce*): Add.
* signals/signals.c [HAVE_SIGNAL_H]: Check.
(do_target_signal_to_host): Silence 'not used' warning.
* config/arm/tm-wince.h: Remove.
gdb/gdbserver/
* gdbserver/configure.ac: Add errno checking.
(AC_CHECK_HEADERS): Add errno.h, fcntl.h, signal.h,
sys/file.h and malloc.h.
(AC_CHECK_DECLS): Add perror.
(srv_mingwce): Handle.
* gdbserver/configure.srv (i[34567]86-*-cygwin*): Add
win32-i386-low.o to srv_tgtobj.
(i[34567]86-*-mingw*): Likewise.
(arm*-*-mingw32ce*): Add case.
* gdbreplay.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_ERRNO_H, HAVE_MALLOC_H]: Check.
[__MINGW32CE__] (strerror): New function.
[__MINGW32CE__] (errno): Define to GetLastError.
[__MINGW32CE__] (COUNTOF): New macro.
(remote_open): Remove extra close call.
* mem-break.c (delete_breakpoint_at): New function.
* mem-break.h (delete_breakpoint_at): Declare.
* remote-utils.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_UNISTD_H, HAVE_ERRNO_H]: Check.
[USE_WIN32API] (read, write): Add char* casts.
* server.c [HAVE_UNISTD_H, HAVE_SIGNAL_H]: Check.
* server.h: Include wincecompat.h on Windows CE.
[HAVE_ERRNO_H]: Check.
(perror): Declare if not declared.
* utils.c: Add stdlib.h, errno.h and malloc.h includes.
(perror_with_name): Remove errno declaration.
* wincecompat.h: New.
* wincecompat.c: New.
* win32-low.h: New.
* win32-arm-low.c: New.
* win32-i386-low.c: New.
(win32-low.c): Include mem-break.h and win32-low.h, and winnt.h.
(OUTMSG2): Make it safe.
(_T): New macro.
(COUNTOF): New macro.
(NUM_REGS): Get it from the low target.
(CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT,
CONTEXT_DEBUG_REGISTERS): Add fallbacks to 0.
(thread_rec): Let low target handle debug registers.
(child_add_thread): Likewise.
(child_init_thread_list): Likewise.
(continue_one_thread): Likewise.
(regptr): New.
(do_child_fetch_inferior_registers): Move to ...
* win32-i386-low.c: ... here, and rename to ...
(do_fetch_inferior_registers): ... this.
* win32-low.c (child_fetch_inferior_registers):
Go through the low target.
(do_child_store_inferior_registers): Use regptr.
(strwinerror): New function.
(win32_create_inferior): Handle Windows CE.
Use strwinerror instead of strerror on Windows error
codes. Add program to the error output.
Don't close the main thread handle on Windows CE.
(win32_attach): Use coredll.dll on Windows CE.
(win32_kill): Close current process and current
thread handles.
(win32_detach): Use coredll.dll on Windows CE.
(win32_resume): Let low target handle debug registers, and
step request.
(handle_exception): Add/Remove initial breakpoint. Avoid
non-existant WSTOPSIG on Windows CE.
(win32_read_inferior_memory): Cast to remove warning.
(win32_arch_string): Go through the low target.
(initialize_low): Call set_breakpoint_data with the low
target's breakpoint.
* win32-low.c (dr, FLAG_TRACE_BIT, FCS_REGNUM,
FOP_REGNUM, mappings): Move to ...
* win32-i386-low.c: ... here.
* win32-low.c (win32_thread_info): Move to ...
* win32-low.h: ... here.
* Makefile.in (SFILES): Add win32-low.c, win32-i386-low.c,
win32-arm-low.c and wincecompat.c.
(all:): Add $EXEEXT.
(install-only:): Likewise.
(gdbserver:): Likewise.
(gdbreplay:): Likewise.
* config.in: Regenerate.
* configure: Regenerate.
2007-03-29 01:06:48 +00:00
|
|
|
#endif
|
1999-04-16 01:35:26 +00:00
|
|
|
#include <ctype.h>
|
gdb/
* arm-wince-tdep.c: New.
* config/arm/wince.mt (DEPRECATED_TM_FILE): Use tm-arm.h.
(MT_CFLAGS): Delete.
(TM_CLIBS): Delete.
(TDEPFILES): Add arm-wince-tdep.o, corelow.o, solib.o,
solib-legacy.o, solib-svr4.o, and remove wince.o.
* configure.tgt (arm*-*-mingw32ce*): Add.
* signals/signals.c [HAVE_SIGNAL_H]: Check.
(do_target_signal_to_host): Silence 'not used' warning.
* config/arm/tm-wince.h: Remove.
gdb/gdbserver/
* gdbserver/configure.ac: Add errno checking.
(AC_CHECK_HEADERS): Add errno.h, fcntl.h, signal.h,
sys/file.h and malloc.h.
(AC_CHECK_DECLS): Add perror.
(srv_mingwce): Handle.
* gdbserver/configure.srv (i[34567]86-*-cygwin*): Add
win32-i386-low.o to srv_tgtobj.
(i[34567]86-*-mingw*): Likewise.
(arm*-*-mingw32ce*): Add case.
* gdbreplay.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_ERRNO_H, HAVE_MALLOC_H]: Check.
[__MINGW32CE__] (strerror): New function.
[__MINGW32CE__] (errno): Define to GetLastError.
[__MINGW32CE__] (COUNTOF): New macro.
(remote_open): Remove extra close call.
* mem-break.c (delete_breakpoint_at): New function.
* mem-break.h (delete_breakpoint_at): Declare.
* remote-utils.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_UNISTD_H, HAVE_ERRNO_H]: Check.
[USE_WIN32API] (read, write): Add char* casts.
* server.c [HAVE_UNISTD_H, HAVE_SIGNAL_H]: Check.
* server.h: Include wincecompat.h on Windows CE.
[HAVE_ERRNO_H]: Check.
(perror): Declare if not declared.
* utils.c: Add stdlib.h, errno.h and malloc.h includes.
(perror_with_name): Remove errno declaration.
* wincecompat.h: New.
* wincecompat.c: New.
* win32-low.h: New.
* win32-arm-low.c: New.
* win32-i386-low.c: New.
(win32-low.c): Include mem-break.h and win32-low.h, and winnt.h.
(OUTMSG2): Make it safe.
(_T): New macro.
(COUNTOF): New macro.
(NUM_REGS): Get it from the low target.
(CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT,
CONTEXT_DEBUG_REGISTERS): Add fallbacks to 0.
(thread_rec): Let low target handle debug registers.
(child_add_thread): Likewise.
(child_init_thread_list): Likewise.
(continue_one_thread): Likewise.
(regptr): New.
(do_child_fetch_inferior_registers): Move to ...
* win32-i386-low.c: ... here, and rename to ...
(do_fetch_inferior_registers): ... this.
* win32-low.c (child_fetch_inferior_registers):
Go through the low target.
(do_child_store_inferior_registers): Use regptr.
(strwinerror): New function.
(win32_create_inferior): Handle Windows CE.
Use strwinerror instead of strerror on Windows error
codes. Add program to the error output.
Don't close the main thread handle on Windows CE.
(win32_attach): Use coredll.dll on Windows CE.
(win32_kill): Close current process and current
thread handles.
(win32_detach): Use coredll.dll on Windows CE.
(win32_resume): Let low target handle debug registers, and
step request.
(handle_exception): Add/Remove initial breakpoint. Avoid
non-existant WSTOPSIG on Windows CE.
(win32_read_inferior_memory): Cast to remove warning.
(win32_arch_string): Go through the low target.
(initialize_low): Call set_breakpoint_data with the low
target's breakpoint.
* win32-low.c (dr, FLAG_TRACE_BIT, FCS_REGNUM,
FOP_REGNUM, mappings): Move to ...
* win32-i386-low.c: ... here.
* win32-low.c (win32_thread_info): Move to ...
* win32-low.h: ... here.
* Makefile.in (SFILES): Add win32-low.c, win32-i386-low.c,
win32-arm-low.c and wincecompat.c.
(all:): Add $EXEEXT.
(install-only:): Likewise.
(gdbserver:): Likewise.
(gdbreplay:): Likewise.
* config.in: Regenerate.
* configure: Regenerate.
2007-03-29 01:06:48 +00:00
|
|
|
#if HAVE_FCNTL_H
|
1999-04-16 01:35:26 +00:00
|
|
|
#include <fcntl.h>
|
gdb/
* arm-wince-tdep.c: New.
* config/arm/wince.mt (DEPRECATED_TM_FILE): Use tm-arm.h.
(MT_CFLAGS): Delete.
(TM_CLIBS): Delete.
(TDEPFILES): Add arm-wince-tdep.o, corelow.o, solib.o,
solib-legacy.o, solib-svr4.o, and remove wince.o.
* configure.tgt (arm*-*-mingw32ce*): Add.
* signals/signals.c [HAVE_SIGNAL_H]: Check.
(do_target_signal_to_host): Silence 'not used' warning.
* config/arm/tm-wince.h: Remove.
gdb/gdbserver/
* gdbserver/configure.ac: Add errno checking.
(AC_CHECK_HEADERS): Add errno.h, fcntl.h, signal.h,
sys/file.h and malloc.h.
(AC_CHECK_DECLS): Add perror.
(srv_mingwce): Handle.
* gdbserver/configure.srv (i[34567]86-*-cygwin*): Add
win32-i386-low.o to srv_tgtobj.
(i[34567]86-*-mingw*): Likewise.
(arm*-*-mingw32ce*): Add case.
* gdbreplay.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_ERRNO_H, HAVE_MALLOC_H]: Check.
[__MINGW32CE__] (strerror): New function.
[__MINGW32CE__] (errno): Define to GetLastError.
[__MINGW32CE__] (COUNTOF): New macro.
(remote_open): Remove extra close call.
* mem-break.c (delete_breakpoint_at): New function.
* mem-break.h (delete_breakpoint_at): Declare.
* remote-utils.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_UNISTD_H, HAVE_ERRNO_H]: Check.
[USE_WIN32API] (read, write): Add char* casts.
* server.c [HAVE_UNISTD_H, HAVE_SIGNAL_H]: Check.
* server.h: Include wincecompat.h on Windows CE.
[HAVE_ERRNO_H]: Check.
(perror): Declare if not declared.
* utils.c: Add stdlib.h, errno.h and malloc.h includes.
(perror_with_name): Remove errno declaration.
* wincecompat.h: New.
* wincecompat.c: New.
* win32-low.h: New.
* win32-arm-low.c: New.
* win32-i386-low.c: New.
(win32-low.c): Include mem-break.h and win32-low.h, and winnt.h.
(OUTMSG2): Make it safe.
(_T): New macro.
(COUNTOF): New macro.
(NUM_REGS): Get it from the low target.
(CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT,
CONTEXT_DEBUG_REGISTERS): Add fallbacks to 0.
(thread_rec): Let low target handle debug registers.
(child_add_thread): Likewise.
(child_init_thread_list): Likewise.
(continue_one_thread): Likewise.
(regptr): New.
(do_child_fetch_inferior_registers): Move to ...
* win32-i386-low.c: ... here, and rename to ...
(do_fetch_inferior_registers): ... this.
* win32-low.c (child_fetch_inferior_registers):
Go through the low target.
(do_child_store_inferior_registers): Use regptr.
(strwinerror): New function.
(win32_create_inferior): Handle Windows CE.
Use strwinerror instead of strerror on Windows error
codes. Add program to the error output.
Don't close the main thread handle on Windows CE.
(win32_attach): Use coredll.dll on Windows CE.
(win32_kill): Close current process and current
thread handles.
(win32_detach): Use coredll.dll on Windows CE.
(win32_resume): Let low target handle debug registers, and
step request.
(handle_exception): Add/Remove initial breakpoint. Avoid
non-existant WSTOPSIG on Windows CE.
(win32_read_inferior_memory): Cast to remove warning.
(win32_arch_string): Go through the low target.
(initialize_low): Call set_breakpoint_data with the low
target's breakpoint.
* win32-low.c (dr, FLAG_TRACE_BIT, FCS_REGNUM,
FOP_REGNUM, mappings): Move to ...
* win32-i386-low.c: ... here.
* win32-low.c (win32_thread_info): Move to ...
* win32-low.h: ... here.
* Makefile.in (SFILES): Add win32-low.c, win32-i386-low.c,
win32-arm-low.c and wincecompat.c.
(all:): Add $EXEEXT.
(install-only:): Likewise.
(gdbserver:): Likewise.
(gdbreplay:): Likewise.
* config.in: Regenerate.
* configure: Regenerate.
2007-03-29 01:06:48 +00:00
|
|
|
#endif
|
1999-11-02 04:44:47 +00:00
|
|
|
#include <errno.h>
|
2002-07-09 17:38:58 +00:00
|
|
|
#include <stdlib.h>
|
2002-04-09 21:11:35 +00:00
|
|
|
#include <string.h>
|
2002-07-09 17:38:58 +00:00
|
|
|
#include <unistd.h>
|
2015-03-09 11:27:05 +00:00
|
|
|
#ifdef HAVE_NETINET_IN_H
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#endif
|
2006-07-23 03:52:15 +00:00
|
|
|
#if HAVE_NETDB_H
|
|
|
|
#include <netdb.h>
|
|
|
|
#endif
|
|
|
|
#if HAVE_NETINET_TCP_H
|
|
|
|
#include <netinet/tcp.h>
|
|
|
|
#endif
|
2014-11-21 14:05:41 +00:00
|
|
|
|
[gdbserver] Move malloc.h include to server.h.
This patch moves all includes of malloc.h, which were introduced
purely to get access to alloca's declaration, to server.h, next
to the include of alloca.h.
There is one exception: gdbreplay.c, which does not include server.h.
In this case, the include of alloca.h was simply moved up a bit, next
to the include of malloc.h.
gdb/gdbserver/ChangeLog:
* gdbreplay.c: Move include of alloca.h up, next to include of
malloc.h.
* server.h: Add include of malloc.h.
* mem-break.c: Remove include of malloc.h.
* server.c, tracepoint.c, utils.c, win32-low.c: Likewise.
2010-09-01 17:29:32 +00:00
|
|
|
#include <alloca.h>
|
2014-11-21 14:05:41 +00:00
|
|
|
|
2015-03-09 11:27:05 +00:00
|
|
|
#if USE_WIN32API
|
|
|
|
#include <winsock2.h>
|
|
|
|
#endif
|
1999-04-16 01:35:26 +00:00
|
|
|
|
* acconfig.h: Remove.
* configure.ac: Add a test for socklen_t. Use three-argument
AC_DEFINE throughout.
* config.in: Regenerated using autoheader 2.59.
* configure: Regenerated.
* gdbreplay.c (socklen_t): Provide a default.
(remote_open): Use socklen_t.
* remote-utils.c (socklen_t): Provide a default.
(remote_open): Use socklen_t.
(convert_int_to_ascii, convert_ascii_to_int, decode_M_packet): Use
unsigned char.
* i387-fp.c (struct i387_fsave, struct i387_fxsave): Use unsigned
char for buffers.
* linux-low.c (linux_read_memory, linux_write_memory)
(linux_read_auxv): Likewise.
* mem-break.c (breakpoint_data, set_breakpoint_data, check_mem_read)
(check_mem_write): Likewise.
* mem-break.h (set_breakpoint_data, check_mem_read, check_mem_write):
Likewise.
* regcache.c (struct inferior_rgcache_data, registers_to_string)
(registers_from_string, register_data): Likewise.
* server.c (handle_query, main): Likewise.
* server.h (convert_ascii_to_int, convert_int_to_ascii)
(decode_M_packet): Likewise.
* target.c (read_inferior_memory, write_inferior_memory): Likewise.
* target.h (struct target_ops): Update read_memory, write_memory,
and read_auxv.
(read_inferior_memory, write_inferior_memory): Update.
* linux-low.h (struct linux_target_ops): Change type of breakpoint
to unsigned char *.
* linux-arm-low.c, linux-cris-low.c, linux-crisv32-low.c,
linux-i386-low.c, linux-m32r-low.c, linux-m68k-low.c,
linux-mips-low.c, linux-ppc-low.c, linux-ppc64-low.c,
linux-s390-low.c, linux-sh-low.c: Update for changes in
read_inferior_memory and the_low_target->breakpoint.
2005-06-13 01:59:22 +00:00
|
|
|
#ifndef HAVE_SOCKLEN_T
|
|
|
|
typedef int socklen_t;
|
|
|
|
#endif
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
/* Sort of a hack... */
|
|
|
|
#define EOL (EOF - 1)
|
|
|
|
|
|
|
|
static int remote_desc;
|
|
|
|
|
gdb/
* arm-wince-tdep.c: New.
* config/arm/wince.mt (DEPRECATED_TM_FILE): Use tm-arm.h.
(MT_CFLAGS): Delete.
(TM_CLIBS): Delete.
(TDEPFILES): Add arm-wince-tdep.o, corelow.o, solib.o,
solib-legacy.o, solib-svr4.o, and remove wince.o.
* configure.tgt (arm*-*-mingw32ce*): Add.
* signals/signals.c [HAVE_SIGNAL_H]: Check.
(do_target_signal_to_host): Silence 'not used' warning.
* config/arm/tm-wince.h: Remove.
gdb/gdbserver/
* gdbserver/configure.ac: Add errno checking.
(AC_CHECK_HEADERS): Add errno.h, fcntl.h, signal.h,
sys/file.h and malloc.h.
(AC_CHECK_DECLS): Add perror.
(srv_mingwce): Handle.
* gdbserver/configure.srv (i[34567]86-*-cygwin*): Add
win32-i386-low.o to srv_tgtobj.
(i[34567]86-*-mingw*): Likewise.
(arm*-*-mingw32ce*): Add case.
* gdbreplay.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_ERRNO_H, HAVE_MALLOC_H]: Check.
[__MINGW32CE__] (strerror): New function.
[__MINGW32CE__] (errno): Define to GetLastError.
[__MINGW32CE__] (COUNTOF): New macro.
(remote_open): Remove extra close call.
* mem-break.c (delete_breakpoint_at): New function.
* mem-break.h (delete_breakpoint_at): Declare.
* remote-utils.c [HAVE_SYS_FILE_H, HAVE_SIGNAL_H,
HAVE_FCNTL_H, HAVE_UNISTD_H, HAVE_ERRNO_H]: Check.
[USE_WIN32API] (read, write): Add char* casts.
* server.c [HAVE_UNISTD_H, HAVE_SIGNAL_H]: Check.
* server.h: Include wincecompat.h on Windows CE.
[HAVE_ERRNO_H]: Check.
(perror): Declare if not declared.
* utils.c: Add stdlib.h, errno.h and malloc.h includes.
(perror_with_name): Remove errno declaration.
* wincecompat.h: New.
* wincecompat.c: New.
* win32-low.h: New.
* win32-arm-low.c: New.
* win32-i386-low.c: New.
(win32-low.c): Include mem-break.h and win32-low.h, and winnt.h.
(OUTMSG2): Make it safe.
(_T): New macro.
(COUNTOF): New macro.
(NUM_REGS): Get it from the low target.
(CONTEXT_EXTENDED_REGISTERS, CONTEXT_FLOATING_POINT,
CONTEXT_DEBUG_REGISTERS): Add fallbacks to 0.
(thread_rec): Let low target handle debug registers.
(child_add_thread): Likewise.
(child_init_thread_list): Likewise.
(continue_one_thread): Likewise.
(regptr): New.
(do_child_fetch_inferior_registers): Move to ...
* win32-i386-low.c: ... here, and rename to ...
(do_fetch_inferior_registers): ... this.
* win32-low.c (child_fetch_inferior_registers):
Go through the low target.
(do_child_store_inferior_registers): Use regptr.
(strwinerror): New function.
(win32_create_inferior): Handle Windows CE.
Use strwinerror instead of strerror on Windows error
codes. Add program to the error output.
Don't close the main thread handle on Windows CE.
(win32_attach): Use coredll.dll on Windows CE.
(win32_kill): Close current process and current
thread handles.
(win32_detach): Use coredll.dll on Windows CE.
(win32_resume): Let low target handle debug registers, and
step request.
(handle_exception): Add/Remove initial breakpoint. Avoid
non-existant WSTOPSIG on Windows CE.
(win32_read_inferior_memory): Cast to remove warning.
(win32_arch_string): Go through the low target.
(initialize_low): Call set_breakpoint_data with the low
target's breakpoint.
* win32-low.c (dr, FLAG_TRACE_BIT, FCS_REGNUM,
FOP_REGNUM, mappings): Move to ...
* win32-i386-low.c: ... here.
* win32-low.c (win32_thread_info): Move to ...
* win32-low.h: ... here.
* Makefile.in (SFILES): Add win32-low.c, win32-i386-low.c,
win32-arm-low.c and wincecompat.c.
(all:): Add $EXEEXT.
(install-only:): Likewise.
(gdbserver:): Likewise.
(gdbreplay:): Likewise.
* config.in: Regenerate.
* configure: Regenerate.
2007-03-29 01:06:48 +00:00
|
|
|
#ifdef __MINGW32CE__
|
|
|
|
|
|
|
|
#ifndef COUNTOF
|
|
|
|
#define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0]))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define errno (GetLastError ())
|
|
|
|
|
|
|
|
char *
|
|
|
|
strerror (DWORD error)
|
|
|
|
{
|
|
|
|
static char buf[1024];
|
|
|
|
WCHAR *msgbuf;
|
|
|
|
DWORD lasterr = GetLastError ();
|
|
|
|
DWORD chars = FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM
|
|
|
|
| FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
|
|
NULL,
|
|
|
|
error,
|
|
|
|
0, /* Default language */
|
|
|
|
(LPVOID)&msgbuf,
|
|
|
|
0,
|
|
|
|
NULL);
|
|
|
|
if (chars != 0)
|
|
|
|
{
|
|
|
|
/* If there is an \r\n appended, zap it. */
|
|
|
|
if (chars >= 2
|
|
|
|
&& msgbuf[chars - 2] == '\r'
|
|
|
|
&& msgbuf[chars - 1] == '\n')
|
|
|
|
{
|
|
|
|
chars -= 2;
|
|
|
|
msgbuf[chars] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (chars > ((COUNTOF (buf)) - 1))
|
|
|
|
{
|
|
|
|
chars = COUNTOF (buf) - 1;
|
|
|
|
msgbuf [chars] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
wcstombs (buf, msgbuf, chars + 1);
|
|
|
|
LocalFree (msgbuf);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sprintf (buf, "unknown win32 error (%ld)", error);
|
|
|
|
|
|
|
|
SetLastError (lasterr);
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* __MINGW32CE__ */
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
/* Print the system error message for errno, and also mention STRING
|
|
|
|
as the file name for which the error was encountered.
|
|
|
|
Then return to command level. */
|
|
|
|
|
2002-07-09 17:38:58 +00:00
|
|
|
static void
|
2009-01-15 22:07:20 +00:00
|
|
|
perror_with_name (const char *string)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
1999-11-02 04:44:47 +00:00
|
|
|
#ifndef STDC_HEADERS
|
1999-04-16 01:35:26 +00:00
|
|
|
extern int errno;
|
1999-11-02 04:44:47 +00:00
|
|
|
#endif
|
|
|
|
const char *err;
|
1999-04-16 01:35:26 +00:00
|
|
|
char *combined;
|
|
|
|
|
2003-06-29 04:01:39 +00:00
|
|
|
err = strerror (errno);
|
|
|
|
if (err == NULL)
|
|
|
|
err = "unknown error";
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
combined = (char *) alloca (strlen (err) + strlen (string) + 3);
|
|
|
|
strcpy (combined, string);
|
|
|
|
strcat (combined, ": ");
|
|
|
|
strcat (combined, err);
|
|
|
|
fprintf (stderr, "\n%s.\n", combined);
|
|
|
|
fflush (stderr);
|
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2000-07-30 01:48:28 +00:00
|
|
|
sync_error (FILE *fp, char *desc, int expect, int got)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
fprintf (stderr, "\n%s\n", desc);
|
|
|
|
fprintf (stderr, "At logfile offset %ld, expected '0x%x' got '0x%x'\n",
|
|
|
|
ftell (fp), expect, got);
|
|
|
|
fflush (stderr);
|
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
|
2010-08-26 16:24:41 +00:00
|
|
|
static void
|
|
|
|
remote_error (const char *desc)
|
|
|
|
{
|
|
|
|
fprintf (stderr, "\n%s\n", desc);
|
|
|
|
fflush (stderr);
|
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
|
2002-07-09 17:38:58 +00:00
|
|
|
static void
|
2000-07-30 01:48:28 +00:00
|
|
|
remote_close (void)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
2006-07-23 03:52:15 +00:00
|
|
|
#ifdef USE_WIN32API
|
|
|
|
closesocket (remote_desc);
|
|
|
|
#else
|
1999-04-16 01:35:26 +00:00
|
|
|
close (remote_desc);
|
2006-07-23 03:52:15 +00:00
|
|
|
#endif
|
1999-04-16 01:35:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Open a connection to a remote debugger.
|
|
|
|
NAME is the filename used for communication. */
|
|
|
|
|
2002-07-09 17:38:58 +00:00
|
|
|
static void
|
2000-07-30 01:48:28 +00:00
|
|
|
remote_open (char *name)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
if (!strchr (name, ':'))
|
|
|
|
{
|
|
|
|
fprintf (stderr, "%s: Must specify tcp connection as host:addr\n", name);
|
|
|
|
fflush (stderr);
|
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-07-23 03:52:15 +00:00
|
|
|
#ifdef USE_WIN32API
|
|
|
|
static int winsock_initialized;
|
|
|
|
#endif
|
1999-04-16 01:35:26 +00:00
|
|
|
char *port_str;
|
|
|
|
int port;
|
2015-03-09 11:27:05 +00:00
|
|
|
struct sockaddr_in sockaddr;
|
* acconfig.h: Remove.
* configure.ac: Add a test for socklen_t. Use three-argument
AC_DEFINE throughout.
* config.in: Regenerated using autoheader 2.59.
* configure: Regenerated.
* gdbreplay.c (socklen_t): Provide a default.
(remote_open): Use socklen_t.
* remote-utils.c (socklen_t): Provide a default.
(remote_open): Use socklen_t.
(convert_int_to_ascii, convert_ascii_to_int, decode_M_packet): Use
unsigned char.
* i387-fp.c (struct i387_fsave, struct i387_fxsave): Use unsigned
char for buffers.
* linux-low.c (linux_read_memory, linux_write_memory)
(linux_read_auxv): Likewise.
* mem-break.c (breakpoint_data, set_breakpoint_data, check_mem_read)
(check_mem_write): Likewise.
* mem-break.h (set_breakpoint_data, check_mem_read, check_mem_write):
Likewise.
* regcache.c (struct inferior_rgcache_data, registers_to_string)
(registers_from_string, register_data): Likewise.
* server.c (handle_query, main): Likewise.
* server.h (convert_ascii_to_int, convert_int_to_ascii)
(decode_M_packet): Likewise.
* target.c (read_inferior_memory, write_inferior_memory): Likewise.
* target.h (struct target_ops): Update read_memory, write_memory,
and read_auxv.
(read_inferior_memory, write_inferior_memory): Update.
* linux-low.h (struct linux_target_ops): Change type of breakpoint
to unsigned char *.
* linux-arm-low.c, linux-cris-low.c, linux-crisv32-low.c,
linux-i386-low.c, linux-m32r-low.c, linux-m68k-low.c,
linux-mips-low.c, linux-ppc-low.c, linux-ppc64-low.c,
linux-s390-low.c, linux-sh-low.c: Update for changes in
read_inferior_memory and the_low_target->breakpoint.
2005-06-13 01:59:22 +00:00
|
|
|
socklen_t tmp;
|
1999-04-16 01:35:26 +00:00
|
|
|
int tmp_desc;
|
|
|
|
|
|
|
|
port_str = strchr (name, ':');
|
|
|
|
|
|
|
|
port = atoi (port_str + 1);
|
|
|
|
|
2006-07-23 03:52:15 +00:00
|
|
|
#ifdef USE_WIN32API
|
|
|
|
if (!winsock_initialized)
|
|
|
|
{
|
|
|
|
WSADATA wsad;
|
|
|
|
|
|
|
|
WSAStartup (MAKEWORD (1, 0), &wsad);
|
|
|
|
winsock_initialized = 1;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
tmp_desc = socket (PF_INET, SOCK_STREAM, 0);
|
2010-05-26 22:40:24 +00:00
|
|
|
if (tmp_desc == -1)
|
1999-04-16 01:35:26 +00:00
|
|
|
perror_with_name ("Can't open socket");
|
|
|
|
|
|
|
|
/* Allow rapid reuse of this port. */
|
|
|
|
tmp = 1;
|
1999-07-07 20:19:36 +00:00
|
|
|
setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
|
|
|
|
sizeof (tmp));
|
1999-04-16 01:35:26 +00:00
|
|
|
|
2015-03-09 11:27:05 +00:00
|
|
|
sockaddr.sin_family = PF_INET;
|
|
|
|
sockaddr.sin_port = htons (port);
|
|
|
|
sockaddr.sin_addr.s_addr = INADDR_ANY;
|
1999-04-16 01:35:26 +00:00
|
|
|
|
2015-03-09 11:27:05 +00:00
|
|
|
if (bind (tmp_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
|
1999-04-16 01:35:26 +00:00
|
|
|
|| listen (tmp_desc, 1))
|
|
|
|
perror_with_name ("Can't bind address");
|
|
|
|
|
2015-03-09 11:27:05 +00:00
|
|
|
tmp = sizeof (sockaddr);
|
|
|
|
remote_desc = accept (tmp_desc, (struct sockaddr *) &sockaddr, &tmp);
|
1999-04-16 01:35:26 +00:00
|
|
|
if (remote_desc == -1)
|
|
|
|
perror_with_name ("Accept failed");
|
|
|
|
|
|
|
|
/* Enable TCP keep alive process. */
|
|
|
|
tmp = 1;
|
2011-01-06 00:14:09 +00:00
|
|
|
setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE,
|
|
|
|
(char *) &tmp, sizeof (tmp));
|
1999-04-16 01:35:26 +00:00
|
|
|
|
|
|
|
/* Tell TCP not to delay small packets. This greatly speeds up
|
* i387-fp.c, linux-arm-low.c, linux-cris-low.c,
linux-crisv32-low.c, linux-i386-low.c, linux-low.c,
linux-mips-low.c, linux-s390-low.c, linux-sparc-low.c,
linux-x86-64-low.c, linux-xtensa-low.c, proc-service.c,
regcache.c, remote-utils.c, server.c, spu-low.c, target.h,
thread-db.c, win32-low.c, xtensa-xtregs.c, gdbreplay.c,
Makefile.in, configure.ac: Fix whitespace throughout.
* configure: Regenerate.
2009-03-22 23:57:10 +00:00
|
|
|
interactive response. */
|
1999-04-16 01:35:26 +00:00
|
|
|
tmp = 1;
|
2002-03-21 02:11:03 +00:00
|
|
|
setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY,
|
1999-07-07 20:19:36 +00:00
|
|
|
(char *) &tmp, sizeof (tmp));
|
1999-04-16 01:35:26 +00:00
|
|
|
|
2006-07-23 03:52:15 +00:00
|
|
|
#ifndef USE_WIN32API
|
|
|
|
close (tmp_desc); /* No longer need this */
|
|
|
|
|
2011-01-06 00:14:09 +00:00
|
|
|
signal (SIGPIPE, SIG_IGN); /* If we don't do this, then
|
|
|
|
gdbreplay simply exits when
|
|
|
|
the remote side dies. */
|
2006-07-23 03:52:15 +00:00
|
|
|
#else
|
|
|
|
closesocket (tmp_desc); /* No longer need this */
|
|
|
|
#endif
|
1999-04-16 01:35:26 +00:00
|
|
|
}
|
|
|
|
|
2006-07-23 03:52:15 +00:00
|
|
|
#if defined(F_SETFL) && defined (FASYNC)
|
1999-04-16 01:35:26 +00:00
|
|
|
fcntl (remote_desc, F_SETFL, FASYNC);
|
2006-07-23 03:52:15 +00:00
|
|
|
#endif
|
1999-04-16 01:35:26 +00:00
|
|
|
|
|
|
|
fprintf (stderr, "Replay logfile using %s\n", name);
|
|
|
|
fflush (stderr);
|
|
|
|
}
|
|
|
|
|
1999-07-07 20:19:36 +00:00
|
|
|
static int
|
2015-06-15 15:08:49 +00:00
|
|
|
fromhex (int ch)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
if (ch >= '0' && ch <= '9')
|
|
|
|
{
|
|
|
|
return (ch - '0');
|
|
|
|
}
|
|
|
|
if (ch >= 'A' && ch <= 'F')
|
|
|
|
{
|
|
|
|
return (ch - 'A' + 10);
|
|
|
|
}
|
|
|
|
if (ch >= 'a' && ch <= 'f')
|
|
|
|
{
|
|
|
|
return (ch - 'a' + 10);
|
|
|
|
}
|
|
|
|
fprintf (stderr, "\nInvalid hex digit '%c'\n", ch);
|
|
|
|
fflush (stderr);
|
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2000-07-30 01:48:28 +00:00
|
|
|
logchar (FILE *fp)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
int ch;
|
|
|
|
int ch2;
|
|
|
|
|
|
|
|
ch = fgetc (fp);
|
|
|
|
fputc (ch, stdout);
|
|
|
|
fflush (stdout);
|
|
|
|
switch (ch)
|
|
|
|
{
|
|
|
|
case '\n':
|
|
|
|
ch = EOL;
|
|
|
|
break;
|
|
|
|
case '\\':
|
|
|
|
ch = fgetc (fp);
|
|
|
|
fputc (ch, stdout);
|
|
|
|
fflush (stdout);
|
|
|
|
switch (ch)
|
|
|
|
{
|
1999-07-07 20:19:36 +00:00
|
|
|
case '\\':
|
|
|
|
break;
|
|
|
|
case 'b':
|
|
|
|
ch = '\b';
|
|
|
|
break;
|
|
|
|
case 'f':
|
|
|
|
ch = '\f';
|
|
|
|
break;
|
|
|
|
case 'n':
|
|
|
|
ch = '\n';
|
|
|
|
break;
|
|
|
|
case 'r':
|
|
|
|
ch = '\r';
|
|
|
|
break;
|
|
|
|
case 't':
|
|
|
|
ch = '\t';
|
|
|
|
break;
|
|
|
|
case 'v':
|
|
|
|
ch = '\v';
|
|
|
|
break;
|
1999-04-16 01:35:26 +00:00
|
|
|
case 'x':
|
|
|
|
ch2 = fgetc (fp);
|
|
|
|
fputc (ch2, stdout);
|
|
|
|
fflush (stdout);
|
2015-06-15 15:08:49 +00:00
|
|
|
ch = fromhex (ch2) << 4;
|
1999-04-16 01:35:26 +00:00
|
|
|
ch2 = fgetc (fp);
|
|
|
|
fputc (ch2, stdout);
|
|
|
|
fflush (stdout);
|
2015-06-15 15:08:49 +00:00
|
|
|
ch |= fromhex (ch2);
|
1999-04-16 01:35:26 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* Treat any other char as just itself */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return (ch);
|
|
|
|
}
|
|
|
|
|
2010-08-26 16:24:41 +00:00
|
|
|
static int
|
|
|
|
gdbchar (int desc)
|
|
|
|
{
|
|
|
|
unsigned char fromgdb;
|
|
|
|
|
|
|
|
if (read (desc, &fromgdb, 1) != 1)
|
|
|
|
return -1;
|
|
|
|
else
|
|
|
|
return fromgdb;
|
|
|
|
}
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
/* Accept input from gdb and match with chars from fp (after skipping one
|
|
|
|
blank) up until a \n is read from fp (which is not matched) */
|
|
|
|
|
2002-07-09 17:38:58 +00:00
|
|
|
static void
|
2000-07-30 01:48:28 +00:00
|
|
|
expect (FILE *fp)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
int fromlog;
|
2010-08-26 16:24:41 +00:00
|
|
|
int fromgdb;
|
1999-04-16 01:35:26 +00:00
|
|
|
|
|
|
|
if ((fromlog = logchar (fp)) != ' ')
|
|
|
|
{
|
|
|
|
sync_error (fp, "Sync error during gdb read of leading blank", ' ',
|
|
|
|
fromlog);
|
|
|
|
}
|
|
|
|
do
|
|
|
|
{
|
|
|
|
fromlog = logchar (fp);
|
|
|
|
if (fromlog == EOL)
|
2010-08-26 16:24:41 +00:00
|
|
|
break;
|
|
|
|
fromgdb = gdbchar (remote_desc);
|
|
|
|
if (fromgdb < 0)
|
|
|
|
remote_error ("Error during read from gdb");
|
1999-07-07 20:19:36 +00:00
|
|
|
}
|
|
|
|
while (fromlog == fromgdb);
|
2010-08-26 16:24:41 +00:00
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
if (fromlog != EOL)
|
|
|
|
{
|
2010-08-26 16:24:41 +00:00
|
|
|
sync_error (fp, "Sync error during read of gdb packet from log", fromlog,
|
1999-04-16 01:35:26 +00:00
|
|
|
fromgdb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Play data back to gdb from fp (after skipping leading blank) up until a
|
|
|
|
\n is read from fp (which is discarded and not sent to gdb). */
|
|
|
|
|
2002-07-09 17:38:58 +00:00
|
|
|
static void
|
2000-07-30 01:48:28 +00:00
|
|
|
play (FILE *fp)
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
int fromlog;
|
|
|
|
char ch;
|
|
|
|
|
|
|
|
if ((fromlog = logchar (fp)) != ' ')
|
|
|
|
{
|
|
|
|
sync_error (fp, "Sync error skipping blank during write to gdb", ' ',
|
|
|
|
fromlog);
|
|
|
|
}
|
|
|
|
while ((fromlog = logchar (fp)) != EOL)
|
|
|
|
{
|
|
|
|
ch = fromlog;
|
2010-08-26 16:24:41 +00:00
|
|
|
if (write (remote_desc, &ch, 1) != 1)
|
|
|
|
remote_error ("Error during write to gdb");
|
1999-04-16 01:35:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-06-05 22:36:57 +00:00
|
|
|
static void
|
|
|
|
gdbreplay_version (void)
|
|
|
|
{
|
|
|
|
printf ("GNU gdbreplay %s%s\n"
|
2015-01-01 09:24:41 +00:00
|
|
|
"Copyright (C) 2015 Free Software Foundation, Inc.\n"
|
2011-01-06 00:14:09 +00:00
|
|
|
"gdbreplay is free software, covered by "
|
|
|
|
"the GNU General Public License.\n"
|
2008-06-06 20:38:35 +00:00
|
|
|
"This gdbreplay was configured as \"%s\"\n",
|
2008-06-05 22:36:57 +00:00
|
|
|
PKGVERSION, version, host_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gdbreplay_usage (FILE *stream)
|
|
|
|
{
|
|
|
|
fprintf (stream, "Usage:\tgdbreplay <logfile> <host:port>\n");
|
|
|
|
if (REPORT_BUGS_TO[0] && stream == stdout)
|
|
|
|
fprintf (stream, "Report bugs to \"%s\".\n", REPORT_BUGS_TO);
|
|
|
|
}
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
int
|
2000-08-26 17:29:53 +00:00
|
|
|
main (int argc, char *argv[])
|
1999-04-16 01:35:26 +00:00
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
int ch;
|
|
|
|
|
2008-06-05 22:36:57 +00:00
|
|
|
if (argc >= 2 && strcmp (argv[1], "--version") == 0)
|
|
|
|
{
|
|
|
|
gdbreplay_version ();
|
|
|
|
exit (0);
|
|
|
|
}
|
|
|
|
if (argc >= 2 && strcmp (argv[1], "--help") == 0)
|
|
|
|
{
|
|
|
|
gdbreplay_usage (stdout);
|
|
|
|
exit (0);
|
|
|
|
}
|
|
|
|
|
1999-04-16 01:35:26 +00:00
|
|
|
if (argc < 3)
|
|
|
|
{
|
2008-06-05 22:36:57 +00:00
|
|
|
gdbreplay_usage (stderr);
|
1999-04-16 01:35:26 +00:00
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
fp = fopen (argv[1], "r");
|
|
|
|
if (fp == NULL)
|
|
|
|
{
|
|
|
|
perror_with_name (argv[1]);
|
1999-07-07 20:19:36 +00:00
|
|
|
}
|
1999-04-16 01:35:26 +00:00
|
|
|
remote_open (argv[2]);
|
|
|
|
while ((ch = logchar (fp)) != EOF)
|
|
|
|
{
|
|
|
|
switch (ch)
|
|
|
|
{
|
|
|
|
case 'w':
|
|
|
|
/* data sent from gdb to gdbreplay, accept and match it */
|
|
|
|
expect (fp);
|
|
|
|
break;
|
|
|
|
case 'r':
|
|
|
|
/* data sent from gdbreplay to gdb, play it */
|
|
|
|
play (fp);
|
|
|
|
break;
|
|
|
|
case 'c':
|
|
|
|
/* Command executed by gdb */
|
|
|
|
while ((ch = logchar (fp)) != EOL);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
remote_close ();
|
|
|
|
exit (0);
|
|
|
|
}
|