Reputation:
Programming in a sense is easy. But bugs are something which always makes more trouble. Can anyone help me with good debugging tricks and softwares in c?
Upvotes: 3
Views: 1918
Reputation: 31
valgrind for memory problems if you're on linux. use gdb/ddd on linux as well. On windows a lot of windows programmers don't seem to be knowledgeable of windbg. It is very useful but has a learning curve like gdb; more powerful than the built in debugger in visual studio. learn to use assert, you will catch lots of stuff and you can turn it off in release code if you so choose. Use a unit testing framework like Check, cunit, etc . Always initialize your pointer, to NULL if nothing else. When you free a pointer set it to NULL. Better you to catch a segfault than your user. Pick a coding standard and stick to it, consistency will help you make fewer mistakes. Keep your functions small if at all possible, this will keep you from having 10 level deep braces which are logic nightmares. If compiling using gcc use -Wall and -Wextra . Use the strn* functions instead of str* functions. Well worth the extra thinking they force you to do.
Upvotes: 0
Reputation: 92854
The following are popular debugging tools.
Some very simple Tricks/Suggestions
-> Always check that nowhere in your code you have dereferenced a wild/dangling pointer
Example 1)
int main()
{
int *p;
*p=10; //Undefined Behaviour (crash on most implementations)
}
Example 2)
int main()
{
int *p=malloc(sizeof(int));
//do something with p
free p;
printf("%d", *p); ////Undefined Behaviour (crash on most implementations)
}
-> Always initialize variables before using
int main()
{
int k;
for(int i= k;i<10;++i)
^^
Ouch
printf("%d",i");
}
Upvotes: 2
Reputation: 78903
In addition to all the other suggestions (gdb, valgrind, all that), some simple rules when writing the code help a lot when debugging afterwards.
size_t
) for array indices and numbers that represent a cardinal,
ptrdiff_t
for pointer differences,
off_t
for file offsets etc. enum
types for tags and case distinctions.int
, long
, char
or
whatever. Avoid them whenever possible.char
for
arithmetic, the signedness problems with that are a plague. Use uint8_t
or int8_t
if you feel the need for such a
thing.double
, pointers, struct
. It is
not true that this is less efficient
with a modern compiler. In most cases it will just
be optimized away when not necessary.
But especially pointer variables that
are not properly initialized can
produce spurious errors and make code
hard to debug. If you have them
initialized to NULL
your program
will fail early, and your debugger will show you the place.assert
macro. This forces you to think of your assumptions and also make your
code fail early if they are not fulfilled.Upvotes: 2
Reputation: 10997
This can be separated into:
Prevention measures:
Post-factum
Upvotes: 1
Reputation: 5657
Tools for debugging are all well and good and for some classes of error they will just point you straight to the problem. The best tip that I have for debugging is that you need to think about it in the right way. What works for me is the following:
Other people will have other ways of approaching debugging, but I find if you have a structured approach to it rather than flailing around changing stuff at random you usually get there and when you do be prepared for the inevitable Why didn't I see that straight away!
Upvotes: 4
Reputation: 21817
Best debugger for C
Best tools for memory leak checking:
Upvotes: 3
Reputation: 10395
Upvotes: 1
Reputation: 93446
From "The Elements of Programming Style" Brian Kernighan, 2nd edition, chapter 2:
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?
So from that; don't be "too clever"!
But apart from that and the answers already given; use a debugger! That is your starting point tool-wise. You'd be amazed how many programmers struggle along without the aid of a debugger, and they are fools to do so.
But before you even get to the debugger, get your compiler to help you as much as possible; set the warning level to high, and set warnings as errors. A static analysis tool such as lint, pclint, or QA-C would be even better.
Upvotes: 9
Reputation: 212929
You might also want to hone your debugging skills by reading the book Debugging by David Agans. Every programmer should read this early on in their career.
Upvotes: 0
Reputation: 44288
Unit testing. Makes getting your software correct a lot easier.
Upvotes: 1