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.