// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Debugging C/C++ Projects Tutorial
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Debugging C/C++ Projects Tutorial - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Debugging C/C++ Projects Tutorial


March 2013 [Revision number: V8.0-1]

The following short tutorial takes you through some of the features for debugging a C or C++ project in NetBeans IDE.


=== Contents

image::images/netbeans-stamp-80-74.png[title="Content on this page applies to the NetBeans IDE 7.4 and 8.0"]

|===
|-  |<<requirements,Requirements>> 

|-  |<<project, Creating the Sample Project>> 

|-  |<<breakpoints, Creating Breakpoints>> 

|-  |<<starting,Starting a Debugging Session>> 

|-  |<<inspecting,Inspecting the State of the Application>> 
|===


== Requirements

*To follow this tutorial, you need the following software and resources.*

|===
|Software or Resource |Version Required 

|NetBeans IDE |link:https://netbeans.org/downloads/index.html[+version 7.4 or 8.0 with NetBeans C/C++ plugin module+] 

|Java Developer Kit (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+version 7 or 8+] 
|===

See the link:../../../community/releases/80/install.html[+NetBeans IDE Installation Instructions+] and link:../../../community/releases/80/cpp-setup-instructions.html[+ Configuring the NetBeans IDE for C/C++/Fortran+] for information on downloading and installing the required software.


== Creating the Sample Project

The NetBeans IDE with C/C++ uses the  ``gdb``  debugger and provides numerous features for debugging your projects. To explore these features, you will use the  ``Quote``  project. If you have not already created this project, do the following:

1. Choose File > New Project.
2. In the project wizard, expand the Samples category and the C/C++ subcategory.
3. Select the Applications subcategory, then select the  ``Quote``  project. Click Next, then click Finish.


== Creating Breakpoints

You can create and manipulate breakpoints in your code at any time without starting a debugging session.


=== Creating and Removing a Line Breakpoint

1. In the  ``Quote_1``  project, open the  ``quote.cc``  file.
2. Set a line breakpoint by clicking in the left margin of the Source Editor window next to line 171 ( ``response = readChar("Enter disk module type: (S for single disks, R for RAID; Q - exit)", 'S');`` ). The line is highlighted in red to indicate that the breakpoint is set.
image::images/line_breakpoint1.png[]
3. You could remove the breakpoint by clicking on the icon in the left margin.
4. Choose Window > Debugging > Breakpoints to open the Breakpoints window. Your line breakpoint is listed under the C/C++ node.
image::images/line_breakpoint2.png[]
5. Expand the C/C++ node to see your breakpoint.
image::images/line_breakpoint2_expand.png[]


=== Creating a Function Breakpoint

1. Click the Create New Breakpoint button in the left margin of the Breakpoints window or choose Debug > New Breakpoint (Ctrl+Shift+F8) to open the New Breakpoint dialog box.
2. In the Debugger Type list, select Native.
3. In the Breakpoint Type list, select Function.
4. Type the function name  ``Customer::GetDiscount``  in the Function Name text field. Click OK. 
image::images/function_breakpoint1.png[]
5. Your function breakpoint is set and is added to the list in the Breakpoints window.
image::images/function_breakpoint2.png[]
6. Click the Select Breakpoint Groups button in the left margin to organize the breakpoints into different groups and select Type.
image::images/group_breakpoint_type.png[]
7. Expand the File:Line and Function groups to display your breakpoints. 
image::images/breakpoint_types.png[]


== Starting a Debugging Session

When you start a debugging session, the IDE starts the  ``gdb``  debugger, then runs the application inside the debugger. The IDE automatically opens the debugger windows and debugger toolbar and prints debugger output to the Output window.

1. Start a debugging session for the  ``Quote_1``  project by clicking the Debug Project button image::images/debugbutton.png[] or by choosing Debug > Debug Project. 
The debugger starts and the application runs. The debug toolbar is displayed. 
image::images/debugger_toolbar.png[]
2. Open the Sessions window by choosing Window > Debugging > Sessions. 
The debugging session is shown in this window.


== Inspecting the State of the Application

1. The  ``Quote_1``  application prompts you for input in the Output (Debug) window.
2. Enter a customer name after the "Enter customer name:" prompt.

The application stops at the Customer::GetDiscount function breakpoint you set earlier and the customer.cc file opens in the editor at the line where the funtion is called. The Breakpoints window lists the two breakpoints you set earlier. The green program counter arrow appears on top of the breakpoint icon of the function breakpoint. 
image::images/function_breakpoint3.png[]

3. Click the tab for the Call Stack window or choose Window > Debugging > Call Stack. The call stack shows three frames.
image::images/call_stack.png[]
4. Open the Variables window and note that one variable is displayed.
5. Click the expand icons to expand the structure. 
image::images/local_variables1.png[]
6. Click the Continue button in the toolbar. 
The  ``GetDiscount``  function is executed, printing the customer discount to the Output (Debug) window. Then you are prompted for input.
7. Enter the input in response to the prompts.

The program stops at the next breakpoint, the line breakpoint you set earlier. In the  ``quote.cc``  file, the green program counter arrow appears on top of the breakpoint icon indicating the line on which the program is stopped. 

image::images/line_breakpoint3.png[]

8. Click the Variables tab and note the long list of variables. 
image::images/local_variables2.png[]
9. Click the Call Stack tab and note that there is now one frame in the stack.
10. Choose Window > Debugging > Registers. 
The Registers window opens, displaying the current contents of the registers. 
image::images/registers.png[] 
11. Choose Window > Debugging > Disassembly. 
The Disassembly window opens, displaying the assembly instructions for the current source file. 
image::images/disassembly.png[] 
12. Click the Continue button in the toolbar and continue entering input in response to the prompts in the Output window until the program is completed.
13. When you press Enter to exit the program, your debug session ends. To end the debug session before the execution of the program was complete, you could click the Finish Debugger Session button in the toolbar or choose Debug > Finish Debugger Session.


== See Also

Please see the link:https://netbeans.org/kb/trails/cnd.html[+C/C++ Learning Trail+] for more articles about developing with C/C++/Fortran in NetBeans IDE.

link:mailto:users@cnd.netbeans.org?subject=Feedback:%20Debugging%20C/C++%20Projects%20-%20NetBeans%20IDE%207.4%20Tutorial[+Send Feedback on This Tutorial+]
