同一命令行启动GDB时Ctrl-C从客户端传至服务器的解决方法
解决Ctrl-C意外终止gdb-server的问题
问题根源
当通过bash -l -c封装命令时,后台启动的gdb-server与前台的gdb-client同属一个进程组。终端按下Ctrl-C时,会将SIGINT信号发送给当前前台进程组的所有进程,导致gdb-server被意外终止,进而触发远程通信错误。
解决方案
方法1:用setsid隔离gdb-server的进程组
setsid会为gdb-server创建独立的会话和进程组,使其脱离当前终端的前台进程组,从而不会收到Ctrl-C发送的SIGINT信号:
bash -l -c "setsid /opt/SEGGER/JLink/JLinkGDBServer -if swd -device Cortex-M33 -speed auto -port 2326 -vd -halt -reportuseraction -nogui -endian little -singlerun & arm-none-eabi-gdb -ex \"target extended-remote :2326\" -ex \"c\""
方法2:用nohup让gdb-server忽略终端信号
nohup会让进程忽略SIGHUP信号,同时可将输出重定向到/dev/null避免生成冗余文件,还能让进程脱离当前前台进程组:
bash -l -c "nohup /opt/SEGGER/JLink/JLinkGDBServer -if swd -device Cortex-M33 -speed auto -port 2326 -vd -halt -reportuseraction -nogui -endian little -singlerun >/dev/null 2>&1 & arm-none-eabi-gdb -ex \"target extended-remote :2326\" -ex \"c\""
方法3:用disown将gdb-server从shell作业列表移除
在启动gdb-server后立即执行disown,使其不再受shell的信号控制:
bash -l -c "/opt/SEGGER/JLink/JLinkGDBServer -if swd -device Cortex-M33 -speed auto -port 2326 -vd -halt -reportuseraction -nogui -endian little -singlerun & disown %1; arm-none-eabi-gdb -ex \"target extended-remote :2326\" -ex \"c\""
验证效果
修改命令后按下Ctrl-C,gdb-client会正常停止,gdb-server会完成目标halt、状态恢复等操作后,根据-singlerun参数自动退出,不会再出现"Remote communication error"的提示。
内容的提问来源于stack exchange,提问作者Tin
相关产品推荐
相关产品推荐

