The breakpoint is set to line 77, file minicom.c.
excerpt:

/* Initialize modem port. */
void port_init(void)
{
<line 77 > m_setparms(portfd, P_BAUDRATE, P_PARITY, P_BITS, P_STOPB,
<line 78 > P_HASRTS[0] == 'Y', P_HASXON[0] == 'Y');
}

Complete debug session:

sudo gdb -d /apps/libc6/glibc-2.27/stamp-dir --args . ./minicom -D /dev/ttyUSB1

[sudo] password for alex: 
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./minicom...done.
(gdb) b 77
Breakpoint 1 at 0x5365: file minicom.c, line 77.
(gdb) run
Starting program: /apps/minicom-2.7.1/debian/minicom/usr/bin/minicom -D /dev/ttyUSB1
Lockfile is stale. Overriding it..

Breakpoint 1, port_init () at minicom.c:77
77	  m_setparms(portfd, P_BAUDRATE, P_PARITY, P_BITS, P_STOPB,
(gdb) s
78	             P_HASRTS[0] == 'Y', P_HASXON[0] == 'Y');
(gdb) s
77	  m_setparms(portfd, P_BAUDRATE, P_PARITY, P_BITS, P_STOPB,
(gdb) s
m_setparms (fd=3, baudr=0x5555557866e0 <mpars+4032> "1500000", 
    par=0x555555786800 <mpars+4320> "N", bits=0x555555786770 <mpars+4176> "8", 
    stopb=0x555555786890 <mpars+4464> "1", hwf=1, swf=0) at sysdep1.c:396
396	{
(gdb) s
397	  int spd = -1;
(gdb) s
399	  int bit = bits[0];
(gdb) s
408	  if (portfd_is_socket)
(gdb) s
413	  tcgetattr(fd, &tty);
(gdb) s
__GI___tcgetattr (fd=3, termios_p=0x7fffffffde10)
    at ../sysdeps/unix/sysv/linux/tcgetattr.c:34
34	{
(gdb) s
38	  retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios);
(gdb) s
34	{
(gdb) s
38	  retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios);
(gdb) s
40	  if (__glibc_likely (retval == 0))
(gdb) s
46	      termios_p->c_line = k_termios.c_line;
(gdb) s
63		memset (__mempcpy (&termios_p->c_cc[0], &k_termios.c_cc[0],
(gdb) s
42	      termios_p->c_iflag = k_termios.c_iflag;
(gdb) s
63		memset (__mempcpy (&termios_p->c_cc[0], &k_termios.c_cc[0],
(gdb) s
42	      termios_p->c_iflag = k_termios.c_iflag;
(gdb) s
46	      termios_p->c_line = k_termios.c_line;
(gdb) s
51	      termios_p->c_ispeed = k_termios.c_cflag & (CBAUD | CBAUDEX);
(gdb) s
63		memset (__mempcpy (&termios_p->c_cc[0], &k_termios.c_cc[0],
(gdb) s
51	      termios_p->c_ispeed = k_termios.c_cflag & (CBAUD | CBAUDEX);
(gdb) s
58	      termios_p->c_ospeed = k_termios.c_cflag & (CBAUD | CBAUDEX);
(gdb) s
63		memset (__mempcpy (&termios_p->c_cc[0], &k_termios.c_cc[0],
(gdb) s
77	}
(gdb) s
m_setparms (fd=3, baudr=0x5555557866e0 <mpars+4032> "1500000", 
    par=0x555555786800 <mpars+4320> "N", bits=0x555555786770 <mpars+4176> "8", 
    stopb=0x555555786890 <mpars+4464> "1", hwf=1, swf=0) at sysdep1.c:420
420	  if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
(gdb) s
Warning:
Cannot insert breakpoint 0.
Cannot access memory at address 0x584724c9a6077db8

__longjmp () at ../sysdeps/x86_64/__longjmp.S:45
45		LIBC_PROBE (longjmp, 3, LP_SIZE@%RDI_LP, -4@%esi, LP_SIZE@%RDX_LP)
(gdb) s
__longjmp () at ../sysdeps/x86_64/__longjmp.S:56
56		movq (JB_RBX*8)(%rdi),%rbx
(gdb) s
57		movq (JB_R12*8)(%rdi),%r12
(gdb) s
58		movq (JB_R13*8)(%rdi),%r13
(gdb) s
59		movq (JB_R14*8)(%rdi),%r14
(gdb) s
60		movq (JB_R15*8)(%rdi),%r15
(gdb) s
62		mov %esi, %eax
(gdb) s
63		mov %R8_LP,%RSP_LP
(gdb) s
64		movq %r9,%rbp
(gdb) s
65		LIBC_PROBE (longjmp_target, 3,
(gdb) s
67		jmpq *%rdx
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
__longjmp () at ../sysdeps/x86_64/__longjmp.S:67
67		jmpq *%rdx
(gdb) s

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb) 

What is odd is the return from tcgetattr function:

(gdb) s
m_setparms (fd=3, baudr=0x5555557866e0 <mpars+4032> "1500000", 
    par=0x555555786800 <mpars+4320> "N", bits=0x555555786770 <mpars+4176> "8", 
    stopb=0x555555786890 <mpars+4464> "1", hwf=1, swf=0) **at sysdep1.c:420**
**420**	  if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
(gdb) s
Warning:
Cannot insert breakpoint 0.
Cannot access memory at address 0x584724c9a6077db8

sysdep1.c (minicom program)

/*
 * Set baudrate, parity and number of bits.
 */
void m_setparms(int fd, char *baudr, char *par, char *bits, char *stopb,
                int hwf, int swf)
{
  int spd = -1;
  int newbaud;
  int bit = bits[0];

#ifdef POSIX_TERMIOS
  struct termios tty;
#else /* POSIX_TERMIOS */
  struct sgttyb tty;
#endif /* POSIX_TERMIOS */

#ifdef USE_SOCKET
  if (portfd_is_socket)
    return;
#endif

#ifdef POSIX_TERMIOS
  tcgetattr(fd, &tty);
#else /* POSIX_TERMIOS */
  ioctl(fd, TIOCGETP, &tty);
#endif /* POSIX_TERMIOS */


  /* We generate mark and space parity ourself. */
  if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
    bit = '8';

  /* Check if 'baudr' is really a number */
  if ((newbaud = (atol(baudr) / 100)) == 0 && baudr[0] != '0')
    newbaud = -1;

  switch (newbaud) {
    case 0:
#ifdef B0
      spd = B0;
#else
      spd = 0;
#endif
      break;
    case 3:	spd = B300;	break;
    case 6:	spd = B600;	break;
    case 12:	spd = B1200;	break;
    case 24:	spd = B2400;	break;
    case 48:	spd = B4800;	break;
    case 96:	spd = B9600;	break;
#ifdef B19200
    case 192:	spd = B19200;	break;
#else /* B19200 */
#  ifdef EXTA
    case 192:	spd = EXTA;	break;
#   else /* EXTA */
    case 192:	spd = B9600;	break;
#   endif /* EXTA */
#endif	 /* B19200 */
#ifdef B38400
    case 384:	spd = B38400;	break;
#else /* B38400 */
#  ifdef EXTB
    case 384:	spd = EXTB;	break;
#   else /* EXTB */
    case 384:	spd = B9600;	break;
#   endif /* EXTB */
#endif	 /* B38400 */
#ifdef B57600
    case 576:	spd = B57600;	break;
#endif
#ifdef B115200
    case 1152:	spd = B115200;	break;
#endif
#ifdef B230400
    case 2304:	spd = B230400;	break;
#endif
#ifdef B460800
    case 4608: spd = B460800; break;
#endif
#ifdef B500000
    case 5000: spd = B500000; break;
#endif
#ifdef B576000
    case 5760: spd = B576000; break;
#endif
#ifdef B921600
    case 9216: spd = B921600; break;
#endif
#ifdef B1000000
    case 10000: spd = B1000000; break;
#endif
#ifdef B1152000
    case 11520: spd = B1152000; break;
#endif
#ifdef B1500000
    case 15000: spd = B1500000; break;
#endif
#ifdef B2000000
    case 20000: spd = B2000000; break;
#endif
#ifdef B2500000
    case 25000: spd = B2500000; break;
#endif
#ifdef B3000000
    case 30000: spd = B3000000; break;
#endif
#ifdef B3500000
    case 35000: spd = B3500000; break;
#endif
#ifdef B4000000
    case 40000: spd = B4000000; break;
#endif
  }

#if defined (_BSD43) && !defined(POSIX_TERMIOS)
  if (spd != -1)
    tty.sg_ispeed = tty.sg_ospeed = spd;
  /* Number of bits is ignored */

  tty.sg_flags = RAW | TANDEM;
  if (par[0] == 'E')
    tty.sg_flags |= EVENP;
  else if (par[0] == 'O')
    tty.sg_flags |= ODDP;
  else
    tty.sg_flags |= PASS8 | ANYP;

  ioctl(fd, TIOCSETP, &tty);

#  ifdef TIOCSDTR
  /* FIXME: huh? - MvS */
  ioctl(fd, TIOCSDTR, 0);
#  endif
#endif /* _BSD43 && !POSIX_TERMIOS */

#if defined (_V7) && !defined(POSIX_TERMIOS)
  if (spd != -1)
    tty.sg_ispeed = tty.sg_ospeed = spd;
  tty.sg_flags = RAW;
  if (par[0] == 'E')
    tty.sg_flags |= EVENP;
  else if (par[0] == 'O')
    tty.sg_flags |= ODDP;

  ioctl(fd, TIOCSETP, &tty);
#endif /* _V7 && !POSIX */

#ifdef POSIX_TERMIOS

  if (spd != -1) {
    cfsetospeed(&tty, (speed_t)spd);
    cfsetispeed(&tty, (speed_t)spd);
  }

  switch (bit) {
    case '5':
      tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5;
      break;
    case '6':
      tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6;
      break;
    case '7':
      tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7;
      break;
    case '8':
    default:
      tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
      break;
  }
  /* Set into raw, no echo mode */
  tty.c_iflag =  IGNBRK;
  tty.c_lflag = 0;
  tty.c_oflag = 0;
  tty.c_cflag |= CLOCAL | CREAD;
#ifdef _DCDFLOW
  tty.c_cflag &= ~CRTSCTS;
#endif
  tty.c_cc[VMIN] = 1;
  tty.c_cc[VTIME] = 5;

  if (swf)
    tty.c_iflag |= IXON | IXOFF;
  else
    tty.c_iflag &= ~(IXON|IXOFF|IXANY);

  tty.c_cflag &= ~(PARENB | PARODD);
  if (par[0] == 'E')
    tty.c_cflag |= PARENB;
  else if (par[0] == 'O')
    tty.c_cflag |= (PARENB | PARODD);

  if (stopb[0] == '2')
    tty.c_cflag |= CSTOPB;
  else
    tty.c_cflag &= ~CSTOPB;

  tcsetattr(fd, TCSANOW, &tty);

  m_setrts(fd);
#endif /* POSIX_TERMIOS */

#ifndef _DCDFLOW
  m_sethwf(fd, hwf);
#endif
}


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <geany/geany-plugins/issues/1179/1149078725@github.com>