首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KGDB不将地址与符号相关联

KGDB不将地址与符号相关联
EN

Stack Overflow用户
提问于 2018-07-11 16:36:35
回答 1查看 374关注 0票数 1

我正在调试Linux内核,特别是蓝牙内核模块。我想逐步了解net/bluetooth/l2cap_core.c中的代码

  • 主机:LinuxMint18.3(运行在VM中)。
  • 目标机器:覆盆子pi 3b+

我使用交叉编译工具在主机上使用调试符号编译内核.在pi上加载内核,它可以很好地引导,我可以在/proc/kallsyms中看到我的目标符号/proc/kallsyms

代码语言:javascript
复制
# grep l2cap_parse_conf_rsp /proc/kallsyms
bf2b67c4 t l2cap_parse_conf_rsp [bluetooth]

我在KDB中设置了断点。

代码语言:javascript
复制
kdb> bp l2cap_parse_conf_rsp
Instruction(i) BP #0 at 0xbf2a77c4 ([bluetooth]l2cap_parse_conf_rsp)
    is enabled  addr at 00000000bf2a77c4, hardtype=0 installed=0
kdb> go

我发送一个蓝牙数据包,并导致断点触发。一旦我们进入KDB,我就切换到KGDB模式。

代码语言:javascript
复制
#
Entering kdb (current=0xda4aa8e0, pid 201) due to Breakpoint @ 0xbf2a77c4
kdb>kgdb
Entering please attach debugger or use $D#44+ or $3#33

在编译内核的主机上,我运行gdb-multiarch ./vmlinux。我使用lx-symbols加载符号地址。这些符号似乎已正确加载:

代码语言:javascript
复制
(gdb) info symbol l2cap_parse_conf_rsp
__UNIQUE_ID_alias38 + 43 in section .modinfo of /home/alex/pi/linux/drivers/bluetooth/btusb.ko
__this_module + 172 in section .gnu.linkonce.this_module of /home/alex/pi/linux/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko
l2cap_parse_conf_rsp in section .text.unlikely of /home/alex/pi/linux/net/bluetooth/bluetooth.ko
__UNIQUE_ID_maximum_substreams19 + 14 in section .modinfo of /home/alex/pi/linux/sound/core/snd-pcm.ko
trace_event_define_fields_cfg80211_ready_on_channel + 204 in section .init.text of /home/alex/pi/linux/net/wireless/cfg80211.ko
__ksymtab_snd_unregister_oss_device + 4 in section __ksymtab of /home/alex/pi/linux/sound/core/snd.ko
__UNIQUE_ID_vermagic8 + 46 in section .modinfo of /home/alex/pi/linux/net/rfkill/rfkill.ko
____versions + 588 in section __versions of /home/alex/pi/linux/drivers/char/broadcom/bcm2835-gpiomem.ko
____versions + 724 in section __versions of /home/alex/pi/linux/drivers/regulator/fixed.ko
____versions + 560 in section __versions of /home/alex/pi/linux/drivers/uio/uio_pdrv_genirq.ko
ipv6_addr_label_rtnl_register + 76 in section .init.text of /home/alex/pi/linux/net/ipv6/ipv6.ko
(gdb)

我甚至可以看到源代码:

代码语言:javascript
复制
(gdb) list l2cap_parse_conf_rsp
3516            return ptr - data;
3517    }
3518
3519    static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len,
3520                                    void *data, u16 *result)
3521    {
3522            struct l2cap_conf_req *req = data;
3523            void *ptr = req->data;
3524            int type, olen;
3525            unsigned long val;

但是,gdb在我逐步遍历代码时无法获取该信息。例如,当我打印回溯跟踪时,当前函数显示为??

代码语言:javascript
复制
(gdb) bt
#0  0xbf2ae7c4 in ?? ()
#1  0xbf299a14 in l2cap_config_rsp (data=<optimized out>, cmd_len=<optimized out>, cmd=<optimized out>, conn=<optimized out>)
    at net/bluetooth/l2cap_core.c:4176
#2  0xbf29ad90 in l2cap_recv_acldata (hcon=<optimized out>, skb=0xd856a240, flags=<optimized out>) at net/bluetooth/l2cap_core.c:7567
#3  0xbf26f9cc in hci_acldata_packet (skb=<optimized out>, hdev=<optimized out>) at net/bluetooth/hci_core.c:4018
#4  hci_rx_work (work=0xda4b5760) at net/bluetooth/hci_core.c:4194
#5  0xc0037f54 in process_one_work (worker=0xd7c10c00, work=0xda4b5760) at kernel/workqueue.c:2096
#6  0xc0038344 in worker_thread (__worker=0xda5d2ae0) at kernel/workqueue.c:2230
#7  0xc003dcc4 in kthread (_create=0xd8995340) at kernel/kthread.c:211
#8  0xc000fba8 in ret_from_fork () at arch/arm/kernel/entry-common.S:118
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

我遗漏了什么?如何告诉GDB地址0xbf2ae7c4对应于符号l2cap_parse_conf_rsp

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-20 03:36:31

我会把这个标记为封闭的。原来,我正在寻找的特定符号位于".text.unlikely“部分,而lx-符号在该部分中不查找符号。我在scripts/gdb/linux/symbols.py中编辑了lx符号脚本,以包括.text.unlikely:

代码语言:javascript
复制
for section_name in [".data", ".data..read_mostly", ".rodata", ".bss", ".text.unlikely"]:
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51290446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档