Debugging in C++

Revision en3, by del_acc, 2019-02-25 14:21:26

cerr

You can use cerr instead of cout to debug. cerr writes to the standard error stream which is not seen by the online judge.

Example:

instead of cout << "x is " << x << '\n';

you can use cerr << "x is " << x << '\n';

One drawback of this is that cerr increase the runtime of a program. The runtime of the below program would decrease if the cerr statements were removed.

for(int i = 0; i<n; i++)
{
    for(int j = 0; j<n; j++)
    {
        cout << i*j << "\n";
        cerr << "i is " << i << "\n"
        cerr << "j is " << j << "\n"
    }
}

We are facing a trade-off between coding time and running time.

When our solution seems good, we should remove some debugging statements which consume some time.

To redirect cerr to a file we have three options(source: https://askubuntu.com/questions/625224/how-to-redirect-stderr-to-a-file):

  1. Redirect stdout to one file and stderr to another file: command > out 2>error

  2. Redirect stderr to stdout (&1), and then redirect stdout to a file: command >out 2>&1

  3. Redirect both to a file: command &> out

Watch Macro

This macro is an easy way to debug variables. It also prints the name of the variable:

#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl

You can use it like this:

#include<bits/stdc++.h>
using namespace std;

#define watch(x) cerr << "\n" << (#x) << " is " << (x) << endl;

int main()
{
    int n;
    n = 2*2;
    watch(n); //output : n is 4
    int exponent = 2;
    watch(pow(n,exponent)); //output: pow(n,exponent) is 16
}

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en4 English del_acc 2019-02-25 18:56:10 163
en3 English del_acc 2019-02-25 14:21:26 364
en2 English del_acc 2019-02-25 14:17:57 20
en1 English del_acc 2019-02-25 14:17:24 1282 Initial revision (published)