I'm debugging a large codebase (written in C++).
Everything works perfectly if I run gdb from a regular terminal as follows:

$ gdb <program-name>
Reading symbols from <program-name>...done.
$ (gdb) start <arg1> <arg2> <arg3>
... (everything running smoothly)
$ (gdb) quit

But when I run it in Emacs gud-mode (with many-windows enabled) it acts all screwy like so:

M-x gdb
Run gdb (like this): gdb -q -i=mi <program-name>

Current directory is ~/
Reading symbols from <program-name>...done.
(gdb) start <arg1> <arg2> <arg3>
Temporary breakpoint 1 at 0x4c04e9: file <path-to-executable>, line <x>.
Starting program: <path-to-executable> <arg1> <arg2> <arg3>
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Temporary breakpoint 1, main (argc=<x>, argv=0x7fffffffe518) at <path-to-executable>/main.cpp:<x>
<x>       <arbitrary-function>;
(gdb) Python Exception <class 'TypeError'> expected string or bytes-like object: 
Python Exception <class 'TypeError'> expected string or bytes-like object:

I don't get why this `Python Exception' is popping up (and continues popping up):

Python Exception <class 'TypeError'> expected string or bytes-like object: 
Python Exception <class 'TypeError'> expected string or bytes-like object:

~24 hours/2 comments later


# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  • I also have problems with gdb-many-windows sometimes (not the same effect as you though) and a Google search showed me that I'm not the only one. There seems to be a race condition that only manifests in the many-windows mode and I haven't found a solution.. Commented Oct 17, 2018 at 12:11
  • Is it possible that you have multiple versions of Python installed and that you have one somehow selected in your .bashrc or something like that? It seems like some sort of gdb plugin problem, and they are written in Python.
    – wvxvw
    Commented Oct 17, 2018 at 14:51
  • @wvxvw I just update the question including my .bashrc file. I couldn't find any instances of any python settings anywhere in the file. Let me know if you need any more information. Commented Oct 17, 2018 at 22:55
  • @Gilles Could you elaborate more this race condition? Maybe I can look into it more and figure something out. Commented Oct 17, 2018 at 22:55

1 Answer 1


I solved this by upgrading to gdb-8.2.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.