Difference between revisions of "Development/Tutorials/Debugging/Debugging symbols"

Jump to: navigation, search
Line 15: Line 15:
 
#include <KMessageBox>
 
#include <KMessageBox>
 
#include <iostream>
 
#include <iostream>
+
 
 
using namespace std;
 
using namespace std;
  
Line 26: Line 26:
 
                           "http://tutorial.com/",
 
                           "http://tutorial.com/",
 
                           "submit@bugs.kde.org");
 
                           "submit@bugs.kde.org");
+
 
 
     KCmdLineArgs::init( argc, argv, &aboutData );
 
     KCmdLineArgs::init( argc, argv, &aboutData );
 
     KApplication app;
 
     KApplication app;
Line 33: Line 33:
 
     int* i;
 
     int* i;
 
     cout << "i is at " << i << " value " << *i << endl;
 
     cout << "i is at " << i << " value " << *i << endl;
     i=(int*)0x400890;
+
     i=(int*)0x0;
    cout << "i is at " << i << " value " << *i << endl;
+
    // We now try to read from memory address 0x400891
+
    i=(int*)0x400891;
+
 
     cout << "i is at " << i << " value " << *i << endl;
 
     cout << "i is at " << i << " value " << *i << endl;
  

Revision as of 18:03, 11 July 2009

Debugging symbols allow you to debug your application better. Debugging symbols are added to your binary by the compiler. You have to decide during the cmake step if you want debugging symbols or not. To compile your application with debugging symbols, use

cmake . -DCMAKE_BUILD_TYPE=debugfull

to compile it without debugging symbols, use

cmake . -DCMAKE_BUILD_TYPE=release

Depending on your decision, output generated with the command kDebug will also be (debugfull) or not be (release) added to your application.

As an example, let's write an application that crashes:

main.cpp

    
#include <KApplication>
#include <KAboutData>
#include <KCmdLineArgs>
#include <KMessageBox>
#include <iostream>

using namespace std;

int main (int argc, char *argv[])
{
    KAboutData aboutData( "tutorial1", 0, ki18n("Tutorial 1"), "1.0",
                          ki18n("Displays a KMessageBox popup"),
                          KAboutData::License_GPL,
                          ki18n("(c) 2009"), ki18n("Some text..."),
                          "http://tutorial.com/",
                          "submit@bugs.kde.org");

    KCmdLineArgs::init( argc, argv, &aboutData );
    KApplication app;

    KMessageBox::questionYesNo( 0, i18n( "Hello World" ) );
    int* i;
    cout << "i is at " << i << " value " << *i << endl;
    i=(int*)0x0;
    cout << "i is at " << i << " value " << *i << endl;

    return 0;
}

CMakeLists.txt

project (tutorial1)
find_package(KDE4 REQUIRED)
include (KDE4Defaults)
include_directories(${KDE4_INCLUDES})
set(tutorial1_SRCS main.cpp)
kde4_add_executable(tutorial1 ${tutorial1_SRCS})
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})
install(TARGETS tutorial1  ${INSTALL_TARGETS_DEFAULT_ARGS})

Now let's compile this without debugging symbols:

cmake . -DCMAKE_BUILD_TYPE=release && make -j4

We see that the resulting file is small:

# ll tutorial1
-rwxr-xr-x 1 root root 18879 Jul 11 18:07 tutorial1

With debugging symbols, the file is bigger:

cmake . -DCMAKE_BUILD_TYPE=debugfull && make
# ll tutorial1
-rwxr-xr-x 1 root root 256622 Jul 11 18:09 tutorial1

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V.Legal