質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1365閲覧

標準入出力を使ったプログラムのデバッグを皆さんはどうしているのでしょう?

cateye

総合スコア6851

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/09/01 18:41

例えば、下記のプログラムは標準入力(std::cin)からテキストファイルを読み込み行番号を付けて標準出力(std::cout)に出力するものですが、この様なプログラムをデバッグする場合どのようにするのがいいのでしょうか?

c++

1// 2#include <iostream> 3#include <string> 4#include <iomanip> 5// 6using namespace std; 7// 8int main(void) 9{ 10 int lno= 0; 11 string iStr; 12 // 13 while(getline(cin,iStr)){ 14 cout << setw(4) << ++lno << ' ' << iStr << endl; 15 } 16 // 17 return 0; 18}

「環境」
FreeBSD 11.1-RELEASE-p1
clang version 4.0.0
CodeLite(IDE)

今までファイルの入出力などは使っていましたが標準入出力を使った(デバッグ)経験は皆無です。で、
・エラー出力(std::cerr)で表示して確認する。
・fprintf()などを入れてファイルで結果を確認する。
などは考えたのですが、もう少しマシな(やりやすい)方法があればご教授いただきたいのですが。言葉足らずの所があればご指摘ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

私はあまりstd::cerrは所謂printfデバッグには使わないです。
Windowsではstd::cerrはバッファリングされないためstd::coutと同期がとれず必要な情報を取るのが意外に難しいからです。

短命なプログラムのデバッグ時は、std::coutへデバッグ出力も出し、ターゲットの出力とデバッグ用出力を区別できるようデバッグ出力側を[]で囲う等の工夫をしてます。
長命なプログラムの場合は真面目にログ出力を作ってそこに出します。リリース後もログを出力できるようにしておけば、客先でのトラブル対策も可能になりますし。

ついでに、ログ・レベルを指定できるロガーって多いのですが、色々トライした結果、ログ・レベルの指定はしません。お客様環境でログ・レベルの指定を変更しつつログを取るなんて事実上不可能ですし、自分でデバッグする場合も結局全部出力してデバッグすることがほとんどなので。ただし、後から解析しやすいよう、ログの種類毎に決まったマーカー文字列を付けておきます。これにより、grepするときれいに分かれます。一緒にスレッドIDも出しておくとマルチスレッド、マルチプロセスなシステムのデバッグもやりやすくなります。

また、ログの行ヘッダ部をカンマ区切りしておくと、Excel等で解析しやすいので意外に便利な時もあります。

投稿2017/09/02 03:28

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2017/09/02 04:11

なるほど。これは標準動作だったのですね。 そんな気もしてたのですが、ちょっと自信がなくて。 ありがとうです。
cateye

2017/09/02 10:16

>ヘッダ部をカンマ区切りしておくと、Excel等〜 なるほど、これは気がつきませんでした^^; ありがとうございます
cateye

2017/09/02 10:35

皆さん色々案を出して頂いてありがとうございます。プログラム自体が小さい(1秒程度で終了w)のでやっぱり#ifdef & coutでやっていこうと思います。
guest

0

普通に、コマンドラインでリダイレクトやパイプを使って動かしてみる、というのは駄目なのでしょうか。IDE から実行できないと駄目とかなのかな。
デバッグするプログラムをコンパイルしてできた実行ファイルが prog として、

$ ./prog < test.txt

みたいな。

そういう話ではなくて、このようにテストをするとして、デバッグ用情報の print をどのように実行して、どのように拾うか、という話でしょうか。

標準エラーにデバッグ情報を吐き出すというのは「まとも」な方法です。prog のコマンドラインオプションとしてデバッグフラグやデバッグレベルを制御できるものを用意し、それに応じて標準エラーに情報を吐き出すのは「まとも」なコマンドでもよくあります。開発中のデバッグだけでなく、運用時の不具合調査のためにも役立つ詳細情報なら、コマンドラインオプションを指定すれば出力できるようにプログラムを作っておくのも悪くありません。
コマンドラインオプションの例を以下に示します。

$ ./prog --verbose # 冗長モード $ ./prog -v # 冗長モード $ ./prog -vv # もっと冗長モード $ ./prog -vvv # もっともっと冗長モード $ ./prog -d # デバッグモード $ ./prog --debug # デバッグモード $ ./prog --debug=3 # デバッグレベル指定

投稿2017/09/01 19:31

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2017/09/02 10:31 編集

リンク時にうまく行かないときなど、-vのパラメータはよく出てきますd^^ 今回のプログラムは私用で作っている物(高々2000行程度)なので“デバッグ処理を埋め込みたくない”ということもありますので通常のcoutでやっていきたいと思います。有難うございました、今後の参考にさせていただきます。 
cateye

2017/09/02 10:39

申し遅れました、IDEは得に考えていません。多分パイプからデータ受け取って加工するプログラムに付いてはIDEでは難しいと思いますので。
unau

2017/09/02 12:00

質問内容からは技術レベルがわからなかったのでこんな回答にしましたが、C++ なんてここ 20 年触っていない私がちゃちゃを入れることもなかったみたいで。
guest

0

C++で応用できるかわかりませんが、Cの場合でファイル入出力までできているならば、ファイルポインタをstdin/stdoutに変更すれば読み込み元/書き込み先をファイルから標準入出力に変更できます。

後は少しだけ条件分岐を追加するとかマクロでコンパイル時切り替えすれば、デバッグ時だけファイル入出力にするということができます。

投稿2017/09/02 05:11

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2017/09/02 10:43 編集

ありがとうございます。質問する前の話ですが、私の無知で、ifstream inFile(cin);などとして失敗しました;; クラスを作るときにコンストラクタのパラメタとして入力ファイルを渡しているので、これが出きると楽なんですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問