aboutsummaryrefslogtreecommitdiffstats
path: root/docs/gettingstarted/developers/gdb_examples.rst
blob: 8a0fb33e2a857818e54691a3d3f9a18ffa0a877c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
.. _gdb_examples:

.. toctree::

GDB Examples
===============

In this section we have a few useful gdb commands.

Starting GDB
----------------------------

Once at the gdb prompt, VPP can be started by running the following commands:

.. code-block:: console

   (gdb) run -c /etc/vpp/startup.conf
   Starting program: /scratch/vpp-master/build-root/install-vpp_debug-native/vpp/bin/vpp -c /etc/vpp/startup.conf
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    vlib_plugin_early_init:361: plugin path /scratch/vpp-master/build-root/install-vpp_debug-native/vpp/lib/vpp_plugins:/scratch/vpp-master/build-root/install-vpp_debug-native/vpp/lib64/vpp_plugins
    ....

Backtrace
----------------------------

If you encounter errors when running VPP, such as VPP terminating due to a segfault
or abort signal, then you can run the VPP debug binary and then execute **backtrace** or **bt**.

.. code-block:: console

    (gdb) bt
    #0  ip4_icmp_input (vm=0x7ffff7b89a40 <vlib_global_main>, node=0x7fffb6bb6900, frame=0x7fffb6725ac0) at /scratch/vpp-master/build-data/../src/vnet/ip/icmp4.c:187
    #1  0x00007ffff78da4be in dispatch_node (vm=0x7ffff7b89a40 <vlib_global_main>, node=0x7fffb6bb    6900, type=VLIB_NODE_TYPE_INTERNAL, dispatch_state=VLIB_NODE_STATE_POLLING, frame=0x7fffb6725ac0, last_time_stamp=10581236529    65565) at /scratch/vpp-master/build-data/../src/vlib/main.c:988
    #2  0x00007ffff78daa77 in dispatch_pending_node (vm=0x7ffff7b89a40 <vlib_global_main>, pending_f    rame_index=6, last_time_stamp=1058123652965565) at /scratch/vpp-master/build-data/../src/vlib/main.c:1138
    ....

Get to the GDB prompt
---------------------------------------

When VPP is running, you can get to the command prompt by pressing **CTRL+C**.

Breakpoints
---------------------------------------

When at the GDB prompt, set a breakpoint by running the commands below:

.. code-block:: console

    (gdb) break ip4_icmp_input
    Breakpoint 4 at 0x7ffff6b9c00b: file /scratch/vpp-master/build-data/../src/vnet/ip/icmp4.c, line 142.

List the breakpoints already set:

.. code-block:: console

    (gdb) i b
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0x00007ffff6b9c00b in ip4_icmp_input at /scratch/vpp-master/build-data/../src/vnet/ip/icmp4.c:142
        breakpoint already hit 3 times
    2       breakpoint     keep y   0x00007ffff6b9c00b in ip4_icmp_input at /scratch/vpp-master/build-data/../src/vnet/ip/icmp4.c:142
    3       breakpoint     keep y   0x00007ffff640f646 in tw_timer_expire_timers_internal_1t_3w_1024sl_ov 
        at /scratch/vpp-master/build-data/../src/vppinfra/tw_timer_template.c:775

Delete a breakpoint:

.. code-block:: console

    (gdb) del 2
    (gdb) i b
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0x00007ffff6b9c00b in ip4_icmp_input at /scratch/vpp-master/build-data/../src/vnet/ip/icmp4.c:142
	breakpoint already hit 3 times
    3       breakpoint     keep y   0x00007ffff640f646 in tw_timer_expire_timers_internal_1t_3w_1024sl_ov 
        at /scratch/vpp-master/build-data/../src/vppinfra/tw_timer_template.c:775

Step/Next/List
---------------------------------------

Step through the code using (s)tep into, (n)ext, and list some lines before and after where you are with list.

.. code-block:: console

    Thread 1 "vpp_main" hit Breakpoint 1, ip4_icmp_input (vm=0x7ffff7b89a40 <vlib_global_main>, node=0x7fffb6bb6900, frame=0x7fffb6709480)
        at /scratch/jdenisco/vpp-master/build-data/../src/vnet/ip/icmp4.c:142
    142	{
    (gdb) n
    143	  icmp4_main_t *im = &icmp4_main;
    (
    (gdb) list
    202	      vlib_put_next_frame (vm, node, next, n_left_to_next);
    203	    }
    204	
    205	  return frame->n_vectors;
    206	}
    207	
    208	/* *INDENT-OFF* */
    209	VLIB_REGISTER_NODE (ip4_icmp_input_node,static) = {
    210	  .function = ip4_icmp_input,
    211	  .name = "ip4-icmp-input",

Examining Data and packets
-----------------------------------------------

To look at data and packets use e(x)amine or (p)rint.


For example in this code look at the ip packet:

.. code-block:: console

    (gdb) p/x *ip0
    $3 = {{ip_version_and_header_length = 0x45, tos = 0x0, length = 0x5400,
    fragment_id = 0x7049, flags_and_fragment_offset = 0x40, ttl = 0x40, protocol = 0x1,
    checksum = 0x2ddd, {{src_address = {data = {0xa, 0x0, 0x0, 0x2},
    data_u32 = 0x200000a, as_u8 = {0xa, 0x0, 0x0, 0x2}, as_u16 = {0xa, 0x200},
    as_u32 = 0x200000a}, dst_address = {data = {0xa, 0x0, 0x0, 0xa}, data_u32 = 0xa00000a,
    as_u8 = {0xa, 0x0, 0x0, 0xa}, as_u16 = {0xa, 0xa00},  as_u32 = 0xa00000a}},
    address_pair = {src = {data = {0xa, 0x0, 0x0, 0x2}, data_u32 = 0x200000a,
    as_u8 = {0xa, 0x0, 0x0, 0x2}, as_u16 = {0xa, 0x200},  as_u32 = 0x200000a},
    dst = {data = {0xa, 0x0, 0x0, 0xa}, data_u32 = 0xa00000a, as_u8 = {0xa, 0x0, 0x0, 0xa},
    as_u16 = {0xa, 0xa00}, as_u32 = 0xa00000a}}}}, {checksum_data_64 =
    {0x40704954000045, 0x200000a2ddd0140}, checksum_data_64_32 = {0xa00000a}},
    {checksum_data_32 = {0x54000045, 0x407049, 0x2ddd0140, 0x200000a, 0xa00000a}}}
      
Then the icmp header

.. code-block:: console

    (gdb) p/x *icmp0
    $4 = {type = 0x8, code = 0x0, checksum = 0xf148}

Then look at the actual bytes:

.. code-block:: console

    (gdb) x/50w ip0
    0x7fde9953510e:	0x54000045	0x00407049	0x2ddd0140	0x0200000a
    0x7fde9953511e:	0x0a00000a	0xf1480008	0x03000554	0x5b6b2e8a
    0x7fde9953512e:	0x00000000	0x000ca99a	0x00000000	0x13121110
    0x7fde9953513e:	0x17161514	0x1b1a1918	0x1f1e1d1c	0x23222120