3

方法を聞かないでください-私は少しもしていません。

次のコードは、静的チェックツールの警告を表示せずに、端末と使用しているランタイム分析ツールをクラッシュさせます。Valgrind、cppcheck、およびgdbは、私に少し良いことをしてくれました。g++-壁は私に有用なものを何も与えません。

このコードの目的は、USBシリアル接続を介してaudrinoに文字を書き込むことです。audrinoアドレスが最初の引数として渡されます。unsigned intが渡され、unsignedcharにキャストされます。

#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;
}

さて、これは正気だと思われる機会に、バグレポートを提出します。

システム仕様:「g ++-g-Wallcode.c」でコンパイルされた最新のArchlinux64ビット

4

2 に答える 2

5

「端末がクラッシュした」とは、端末が機能しなくなったことを意味する場合、その理由はおそらく、stdout (端末) であらゆる種類のフラグをゼロに設定しているためです。tcsetattr()基本的に、そこにあるすべての端末制御フラグを呼び出してゼロにします。

で現在の端末フラグを取得し、tcgetattr()変更したいものを変更してから、その構造体を呼び出しに使用する必要がありますtcsetattr()。そうしないと、未定義の動作になります。

が指す構造体の値がonの呼び出しの結果から導出されたものでない場合、の効果tcsetattr()は未定義です。アプリケーションは、 と の呼び出しの間に、この仕様で定義されたフィールドとフラグのみを変更し、他のすべてのフィールドとフラグは変更しないでください。termiostermios_ptcgetattr()fildestcgetattr()tcsetattr()

于 2012-06-07T03:17:40.240 に答える
2

Linuxを使用している場合は、使用できますstrace

strace ./yourProgram

コアダンプ ファイルをデバッグすることもできます。

ulimit -c unlimited
g++ -g ...

プログラムがクラッシュすると、コアダンプ ファイルが作成されます。

gdb ./yourProgram coredump

コマンドを使用btしてクラッシュ情報を調べます。

于 2012-06-07T03:12:19.833 に答える