Debugging in C++

Revision en4, by del_acc, 2019-02-25 18:56:10

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 remove the cerr statements quickly you can use #define cerr if(false)cerr. Thanks to sharepoLOVEDDD for pointing in out in the comments

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)