gpt4 book ai didi

C++ 程序使终端崩溃——如何调试?

转载 作者:太空狗 更新时间:2023-10-29 20:16:02 25 4
gpt4 key购买 nike

别问我怎么了——我一点都没有。

以下代码使我的终端和我使用的任何运行时分析工具崩溃,同时没有引发任何静态检查工具警告。 Valgrind、cppcheck 和 gdb 对我帮助不大。 g++ -Wall 没有给我任何有用的东西。

代码的目标是通过 USB 串行连接将字符写入 audrino。 audrino 地址作为第一个参数传递。无符号整数被传递并转换为无符号字符。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <iostream>

using namespace std;

int main(int argc,char** argv){

struct termios stdio;
int tty_fd;

unsigned char ctrlChar;
unsigned int ctrlInt;

tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);
tcgetattr(tty_fd, &stdio);
cfmakeraw(&stdio);
stdio.c_cc[VMIN] = 1;
stdio.c_cc[VTIME] = 0;
tcsetattr(tty_fd,TCSANOW, &stdio);
tcsetattr(tty_fd,TCSAFLUSH, &stdio);
fcntl(tty_fd, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK);

cfsetospeed(&stdio,B9600); // 9600 baud
cfsetispeed(&stdio,B9600); // 9600 baud

cout << "ready on " << argv[1] << endl;

scanf("%u", ctrlInt);
cout <<"recieved initial read.\n";
while (ctrlInt < 256){
ctrlChar = ((char) ctrlInt);
cout << ctrlInt << ctrlChar << endl;
write(tty_fd,&ctrlChar,1);
cout << "sent to audrino.\n";
scanf("%u", ctrlInt);
}

cout << "done!" << endl;

close(tty_fd);
return 0;
}

现在,如果这看起来合理,我将提交错误报告。

Sys 规范:最新的 Arch linux 64 位,使用“g++ -g -Wall code.c”编译

最佳答案

如果“我的终端崩溃”是指终端停止工作,那么很可能是因为您在标准输出(也就是您的终端)上将各种标志设置为零。您正在调用 tcsetattr() 并基本上将所有终端控制标志清零。

您应该使用 tcgetattr() 获取当前终端标志,修改您想要修改的那些,然后使用该结构调用 tcsetattr()。不这样做甚至是undefined behavior :

The effect of tcsetattr() is undefined if the value of the termios structure pointed to by termios_p was not derived from the result of a call to tcgetattr() on fildes; an application should modify only fields and flags defined by this specification between the call to tcgetattr() and tcsetattr(), leaving all other fields and flags unmodified.

关于C++ 程序使终端崩溃——如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10925048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com