Commit graph

56983 commits

Author SHA1 Message Date
xuxingliang
f849092ede gdb/memdump: add option to parse memdump log from device
igned-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-25 00:42:34 +08:00
xuxingliang
06a696076a gdb/memdump: reorganize the memdump parameters
Make the dump_nodes etc more common to use.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-25 00:42:34 +08:00
xuxingliang
6d2ebfdec6 mm: dump node overheadp during memdump
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-25 00:42:34 +08:00
xuxingliang
797f7a043d gdb/memdump: show prev and next node in address finding mode
This will make it easier to debug memory corruption when agacent node is corrupted.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-25 00:42:34 +08:00
xuxingliang
dd7203aff7 gdb/mm: move memleak to standalone file
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-25 00:42:34 +08:00
Xu Xingliang
412644fcf2 gdb: optimize memory commands
Tested on a complex project, results are promising.

Command                 Time cost(s)           Time saving(s)   Peformance Boost
                        Before      After
memleak                 39.494172   22.366415   17.127757       1.8
memdump                 41.872441   26.458386   15.414055       1.6
memdump -a 0x1234       28.116294   1.114119    27.002175       25.2
memdump --no-backtrace    N/A       1.114119
memmap                  7.973809    6.836468    1.137341        1.2

Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
2024-11-25 00:42:34 +08:00
xuxingliang
9f9cc7eceb gdb/fs: use Value and Protocol for easy access and hinting
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 17:52:42 +08:00
xuxingliang
a59a28de5b gdb/utils: enhance utils.Value
Added __format__ method to support format spec like {:>10} that gdb.Value doesn't support. For such case, gdb.Value is converted to python value firstly and then format natively.
Override all methods/attributes could return gdb.Value to return utils.Value instead.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 17:52:42 +08:00
xuxingliang
03a38fa633 gdb/fs: handle special inode of epoll, eventfd etc.
Those inodes have no name, handle them so the path can correctly show.
Add FILEP output so we can investigate furthure manually.
Change OFLAGS to hex output and increase word space.

E.g.
(gdb) fdinfo -p 120
PID: 120
FD  FILEP       OFLAGS      POS       PATH                                            BACKTRACE
0   0x40807f08  0x3         0         /dev/console
1   0x40807f30  0x3         0         /dev/console
2   0x40807f58  0x3         0         /dev/console
3   0x40807f80  0x400       0         epoll
4   0x40807fa8  0x443       0         eventfd
5   0x40807fd0  0x403       0         sock
6   0x40807ff8  0x403       0         sock
7   0x40808020  0x403       0         sock
8   0x40892520  0x403       0         sock
9   0x40892548  0x403       0         sock
10  0x40892570  0x403       0         sock
11  0x40892598  0x403       0         sock
12  0x408925c0  0x403       0         sock
13  0x408925e8  0x403       0         sock
14  0x40892610  0x403       0         sock
15  0x40892638  0x403       0         sock
16  0x40942a20  0x403       0         sock

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 17:52:42 +08:00
xuxingliang
5b43a8cb9b gdb/fs: use python iterator instead of C style callbacks
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 17:52:42 +08:00
yangao1
502377034a nuttxgdb/fs.py:add diagnose api
Signed-off-by: yangao1 <yangao1@xiaomi.com>
2024-11-24 17:52:42 +08:00
dependabot[bot]
52ac99126d Documentation: Bump docutils from 0.18.1 to 0.19
This PR bumps the version of docutils from 0.18.1 to 0.19, as requested by dependabot:
- https://github.com/apache/nuttx/pull/14910
2024-11-24 17:52:30 +08:00
xuxingliang
c013648617 tools/gdb: improve nxgcore speed
Let GDB to read from ELF for readonly data.
Disable this feature by nxgcore --no-trust-readonly.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
3a2d4584c7 gdb/utils: cache backtrace result for better performance
GDB is slow to look up symbols, cache the result to speed up commands like memdump etc.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
f5371e92f3 gdb/backtrace: optimize backtrace formatting
Use a class Bactrace to support convert address to backtrace, format to string, accessing element and iterate though them.
Adjust usage in fs and addr2line to make full use of it.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
38b5dcd42c gdb/register: register name sp, pc are always available
GDB provides four “standard” register names sp, pc, fp and ps. Those can be used in most of the cases.

See https://sourceware.org/gdb/current/onlinedocs/gdb.html/Registers.html

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
73467989c5 gdb: move profiling commands to profile.py
Add simple time command to test time cost of a command.
Usage:
(gdb) time memleak
...
(gdb) Time elapsed: 1.23456s

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
Xu Xingliang
6949ff6a7d gdb: add sizeof helper
Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
84c66505aa tools/gdb: add function to convert C enum to python Enum class
Usage:
(gdb) py NX_INITSTATE = utils.enum("enum nx_initstate_e")
(gdb) py print(list(NX_INITSTATE))
[<NX_INITSTATE_E.POWERUP: 0>, <NX_INITSTATE_E.BOOT: 1>, <NX_INITSTATE_E.TASKLISTS: 2>, <NX_INITSTATE_E.MEMORY: 3>, <NX_INITSTATE_E.HARDWARE: 4>, <NX_INITSTATE_E.OSREADY: 5>, <NX_INITSTATE_E.IDLELOOP: 6>, <NX_INITSTATE_E.PANIC: 7>]
(gdb) py print(NX_INITSTATE.POWERUP)
NX_INITSTATE_E.POWERUP
(gdb) py print(NX_INITSTATE.POWERUP.value)
0
(gdb) py print(NX_INITSTATE(1))

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
379eee2f4e tools/gdb: fix hexdump expression parse
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
yangao1
40efe1af11 nuttxgdb/utils.py:add ArrayIterator reverse iterate.
Signed-off-by: yangao1 <yangao1@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
e3b3da3bd1 tools/gdb: support string type in offset_of
1. Support any type of value as pointer address in container_of
2. Support string as type in offset_of
3. Make sure type is a pointer in container_of, and not a pointer in
   offset_of

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
d02dc3893c tools/gdb: decode backtrace of crashlog
Now crash log can be directly pass to addr2line tool to get all backtraces.

E.g.
(gdb) addr2line -f crash.log -p 485
Address              Symbol                           Source

Backtrace of 485
0x402cc0ac           <up_switch_context+84>           /home/work/ssd1/workspace/MiRTOS-X4b-Stable-Build/nuttx/include/arch/syscall.h:179
0x40291276           <nxsig_timedwait+386>            signal/sig_timedwait.c:365
0x4028fc7e           <nxsig_nanosleep+106>            signal/sig_nanosleep.c:141
0x4028fdba           <clock_nanosleep+26>             signal/sig_nanosleep.c:333
0x402c3736           <usleep+62>                      unistd/lib_usleep.c:108
0x415018c0           <cs2p2p_mSecSleep+24>            Src/PPPP_Common.c:1139
0x414fabde           <cs2p2p_Run_send_DRW+258>        Src/PPPP_API.c:5577
0x414fac62           <cs2p2p_PPPP_thread_send_DRW+18> Src/PPPP_API.c:5616
0x40446f62           <pthread_startup+10>             pthread/pthread_create.c:59
0x41094f4a           <pthread_start+106>              pthread/pthread_create.c:139

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
huangyin5
1e265af8eb tools/gdb: add utils.get_tid(tcb)
Signed-off-by: huangyin5 <huangyin5@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
69613d5199 tools/gdb: add array iterator
Use array iterator where possible.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
Zhe Weng
0cda6278d3 tools/gdb: Use ptr's value instead of ptr's adderess in container_of
We're using `ptr.cast(get_long_type())` a week ago to get the pointer's value, it's alright, but `ptr.address` is not, the `ptr.address` will return **the address of the pointer**.

These values are the address of first element in the queue:
    - `int(g_sigfreeaction["head"])`
    - `g_sigfreeaction["head"].cast(get_long_type())`
    - `g_sigfreeaction["head"].dereference().address`
But:
    `int(g_sigfreeaction["head"].address)` is the address of the "head" member, which equals to the address of `g_sigfreeaction`

It's happening in NxSQueue:
    g_sigfreeaction = gdb.parse_and_eval("g_sigfreeaction")
    print(["%x" % (node) for node in NxSQueue(g_sigfreeaction)])
    print(["%x" % (node) for node in NxSQueue(g_sigfreeaction, "sigactq_t", "flink")])
Without this patch:
    ['f3c0aa10', 'f3c0aa2c', 'f3c0aa48']
    ['55db90a0', 'f3c0aa10', 'f3c0aa2c']
With this patch:
    ['f3c0aa10', 'f3c0aa2c', 'f3c0aa48']
    ['f3c0aa10', 'f3c0aa2c', 'f3c0aa48']

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-11-24 03:03:40 +08:00
Zhe Weng
a4e5689c7f tools/gdb: Allow utils.container_of with str input
After we introduced NxDQueue and NxSQueue, we're using them like `NxDQueue(g_active_connections, "struct socket_conn_s", "node")` and leads to `utils.container_of(ptr, str, str)`, so maybe we need to allow str input for `utils.container_of`

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-11-24 03:03:40 +08:00
buxiasen
bb461b532b nuttxgdb: fix container_of pointer offset calc problem
Signed-off-by: buxiasen <buxiasen@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
b296b1debe gdb/macro: cache macro info to json and load directly
Use json module to save macro info to json file and load directly. It can save 2seconds for x4b projects to load plugin

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
96a518af35 tools/gdb: fix elf file with special character
Make sure file name is surrounded by \"

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
xuxingliang
6d0d4458cd gdb/macro: fix cached macro info is outdated
Use the file hash instead to avoid file name conflicts

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 03:03:40 +08:00
Zhe Weng
aa74ba5ace tools/gdb: Add command 'netcheck' for checks on network stack
The diagnostics result looks like:
    {
        "title": "Netcheck Report",
        "command": "netcheck",
        "result": "PASS",
        "message": []
    }
or
    {
        "title": "Netcheck Report",
        "command": "netcheck",
        "result": "WARN",
        "message": [
            "[WARNING] IOB used up: free -1 throttle 0"
        ]
    }

The netcheck command reports like:
IOB check: WARN
[WARNING] IOB used up: free -1 throttle 0

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-11-24 02:57:05 +08:00
Zhe Weng
b293c722bd tools/gdb: Make netstats work without socket import
We may get normal IPv4 address print like 10.10.0.1:5001 and a longer
IPv6 like fc000000000000000000000000000001:5001

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-11-24 02:57:05 +08:00
xuxingliang
b885cb3633 gdb/lists: add element option to foreach list
So we can focus on single element of struct, same as array.
Fix typo in foreach array args.element

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 02:55:46 +08:00
xuxingliang
d8eccbc0f2 gdb/lists: add foreach array command to dump array
This command can dump any array with auto length detection or specified
length.

An optional `element` parameter is used to only dump this element in
array when array is in type of struct.

E.g.

(gdb) foreach array g_mmheap->mm_nodelist
0: {preceding = 0, size = 0, pid = 0, seqno = 0, backtrace = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, flink = 0x41692cb8, blink = 0x0}
1: {preceding = 0, size = 0, pid = 0, seqno = 0, backtrace = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, flink = 0x40c378a0, blink = 0x40605f58}

(gdb) foreach array g_mmheap->mm_nodelist -e "flink"
0: 0x41692cb8
1: 0x40c378a0

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 02:55:46 +08:00
xuxingliang
cd3d639153 gdb/lists: optimize foreach list command
NuttX has various of list implementation, but the core of list is to
find next node, and stop iteration.

This change addes parameter of how to get next node by specifying its
element name.

Note the list head must be a pointer type.
E.g.
(gdb) foreach list -n next &g_msgfree
0: {prev = 0x40286200 <g_msgpool+280>, next = 0x4028628c <g_msgpool+420>}
1: {prev = 0x40286e30 <g_msgfree>, next = 0x40286318 <g_msgpool+560>}

(gdb) foreach list "(struct list_node *) 0x40286e30"
0: {prev = 0x40286200 <g_msgpool+280>, next = 0x4028628c <g_msgpool+420>}
1: {prev = 0x40286e30 <g_msgfree>, next = 0x40286318 <g_msgpool+560>}

(gdb) foreach list g_active_tcp_connections.head -n flink -c "struct tcp_conn_s" -m "sconn"                                                                                                                               13:14:07 [1047/1047]
0 @ *(struct tcp_conn_s *)0x40441510 {
  sconn = {
    node = {
      flink = 0x40441658 <g_tcp_connections+984>,
      blink = 0x0
    },
    list = 0x40443754 <g_cbprealloc+1488>,
    list_tail = 0x40443754 <g_cbprealloc+1488>,
    s_error = 0,
    s_options = 0,
    s_rcvtimeo = 0,
    s_sndtimeo = 0,
    s_boundto = 0 '\000',
    s_flags = 105 'i',
    s_tos = 0 '\000',
    s_ttl = 64 '@'
  },
  u = {
    ipv4 = {
      laddr = 16777343,
      raddr = 16777343
    },
    ipv6 = {
      laddr = {127, 256, 127, 256, 0, 0, 0, 0},
      raddr = {0, 0, 0, 0, 0, 0, 0, 0}
    }
  },
  rcvseq = "h\374\375\064",
  sndseq = "h\374\375\063",
  crefs = 1 '\001',
  domain = 2 '\002',
  sa = 0 '\000',
  sv = 12 '\f',
  rto = 12 '\f',
  tcpstateflags = 4 '\004',

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-24 02:55:46 +08:00
buxiasen
8cda0c8648 nuttxgdb: sq_check no normal print when sq_count
Signed-off-by: buxiasen <buxiasen@xiaomi.com>
2024-11-24 02:55:46 +08:00
buxiasen
1a87d4cc3e nuttxgdb: add sq_count support
Signed-off-by: buxiasen <buxiasen@xiaomi.com>
2024-11-24 02:55:46 +08:00
Zhe Weng
c70f3e3f98 tools/gdb: Add check for tail when checking a queue
Tested for:
dq: &g_notifier_pending in both good and bad state (tail goes wrong)
sq: &g_sigfreeaction in good state

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-11-24 02:55:46 +08:00
Zhe Weng
813ba4d714 tools/gdb: Add support for dq in list_check
Tested:
list_check &g_notifier_pending

Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
2024-11-24 02:55:46 +08:00
xuxingliang
1485ecd28e gdb/dmesg: print dmesg in the correct order
Now the dmesg output log in correct time order, from oldest to latest.
The NULL strings are also stripped, if the buffer is never get fully
filled.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00
yangao1
c29f93922a nuttxgdb/dmesg.py:add diagnose api
Signed-off-by: yangao1 <yangao1@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
4e6026efe6 gdb/dmesg: replace non-printable NULL terminator
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00
anjiahao
472b49e11f dmesg.py:use 'replace' avoid decode error
Signed-off-by: anjiahao <anjiahao@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
8b4a4f8539 tools/gdb: add get_task_tls and get_thread_tls
Signed-off-by: rongyichang <rongyichang@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
5d86bee5c7 tools/gdb: add diagnose commands
Run diagnostic related commands anytime to generate report.

E.g `diag report -o systemreport.json`

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
a2da6b94f0 tools/gdb: add foreach prefixed command
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
04b35a2e8f tools/gdb: add pyproject.toml to build as a package
Now the GDB tool can be built with python -m build . to generate a
package.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
5a82e21edb tools/gdb: use iterator for list
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00
xuxingliang
e7c2e7c576 tools/gdb: use remote-register standard
GDB uses remote-register to describe g/G packet. Whatever the target is,
we can always find out the register offset in packet by `maint print
remote-registers`.

In NuttX, we follow the same standard to prepare the packet, in both
coredump and GDB stub.

For example, the CPSR for arm-v7a is at register number of 25, byte
offset of 164. So we define the CPSR in g_reg_offs (164 /4 = 41)th
elementent.

If GDB stub supports qXfer feature, then GDB will ask stub for target
descriptor, which is a standard xml file. If this file is provided, then
the register order is also changed. It's also reflected in 'maint print
remote-registers' output. JLink GDB server supports it for example.

We always use manually added second inferiort to query the original
remote register layout. So it can match with tcbinfo.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
2024-11-23 13:09:16 +08:00