出现问题时,命令输出如下。
sysrepoctl -l 提示 yang 模块不存在
$ sysrepoctl -l
[ERR] Module "yang" was not found in sysrepo.
sysrepoctl error: Failed to list modules (Item not found)
For more details you may try to increase the verbosity up to "-v3".
同时无法安装 netopeer2
netopeer2/build$ sudo make install
...
-- Installing missing sysrepo modules...
[ERR] Internal error (/home/focksor/workSpace/sysrepo/src/context_change.c:509).
sysrepoctl error: Failed to install modules (Internal error)
For more details you may try to increase the verbosity up to "-v3".
CMake Error at cmake_install.cmake:127 (message):
scripts/setup.sh failed: 1
make: *** [Makefile:110: install] Error 1
跟踪命令过程,如下:
$ gdb --args sysrepoctl -l
(gdb) br sr_errinfo_new
Function "sr_errinfo_new" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (sr_errinfo_new) pending.
(gdb) start
(gdb) c
Continuing.
Breakpoint 1, sr_errinfo_new (err_info=0x7fffffffd458, err_code=SR_ERR_NOT_FOUND, msg_format=0x7ffff7f89400 "Module \"%s\" was not found in sysrepo.") at /home/focksor/workSpace/sysrepo/src/log.c:219
219 {
(gdb) bt
#0 sr_errinfo_new (err_info=0x7fffffffd458, err_code=SR_ERR_NOT_FOUND, msg_format=0x7ffff7f89400 "Module \"%s\" was not found in sysrepo.")
at /home/focksor/workSpace/sysrepo/src/log.c:219
#1 0x00007ffff7f1f8d2 in sr_get_module_replay_support (conn=0x55555555d380, module_name=0x555555565e80 "yang", earliest_notif=0x0, enabled=0x7fffffffd4b0)
at /home/focksor/workSpace/sysrepo/src/sysrepo.c:1995
#2 0x000055555555709d in srctl_list_collect (conn=0x55555555d380, ly_ctx=0x55555555d7f0, list=0x7fffffffd558, list_count=0x7fffffffd560)
at /home/focksor/workSpace/sysrepo/src/executables/sysrepoctl.c:351
#3 0x000055555555746f in srctl_list (conn=0x55555555d380) at /home/focksor/workSpace/sysrepo/src/executables/sysrepoctl.c:440
#4 0x000055555555890c in main (argc=2, argv=0x7fffffffda48) at /home/focksor/workSpace/sysrepo/src/executables/sysrepoctl.c:907
可以看到这是在共享内存中没检索到 “yang” 模块。检查一下内存模块:
(gdb) p *((sr_mod_shm_t *)(conn)->mod_shm.addr)
$1 = {mod_count = 0}
模块数量为 0,那就是没有加载任何模块到共享内存中。
检查值 mod_count 的引用位置,可以看到其主要在 sr_shmmod_store_modules 处写入,而这个函数的作用正是往 shm 中存储模块。
检查 sr_shmmod_store_modules 调用,可以看到上述命令执行过程中,命中的路径在 sr_connect 处。该函数先是通过 sr_shmmain_open 尝试打开 shm,如果 shm 不存在则创建,然后初始化模块。
检查共享内存,可以看到 shm 已创建,删除后重新执行命令测试:
$ ls /dev/shm/
sr_ext sr_main sr_mod
$ sudo rm /dev/shm/sr_*
$ sysrepoctl -l
Segmentation fault (core dumped)
发生了 coredump,进 gdb 检查一下:
$ gdb --args sysrepoctl -l
(gdb) start
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f1ab3c in sr_connect (opts=0, conn_p=0x7fffffffd5e8) at /home/focksor/workSpace/sysrepo/src/sysrepo.c:256
256 assert(!strcmp(LYD_NAME(lyd_child(sr_mods)), "content-id"));
(gdb) p sr_mods
$1 = (struct lyd_node *) 0x0
可以看到是访问了空指针导致的。跟踪该变量 sr_mods
的使用,可以看到是在 sr_lydmods_parse 处初始化的。分析此函数逻辑,大致如下:
通过跟踪该函数的执行,可以看到其进入了路径 1:
(gdb) s
1067 if (srpjson_get_path(NULL, ly_mod->name, SR_DS_STARTUP, &path)) {
(gdb) s
srpjson_get_path (plg_name=0x0, mod_name=0x5555555b1320 "sysrepo", ds=SR_DS_STARTUP, path=0x7fffffffd508) at /home/focksor/workSpace/sysrepo/src/plugins/common_json.c:617
617 {
(gdb) fini
Run till exit from #0 srpjson_get_path (plg_name=0x0, mod_name=0x5555555b1320 "sysrepo", ds=SR_DS_STARTUP, path=0x7fffffffd508)
at /home/focksor/workSpace/sysrepo/src/plugins/common_json.c:617
sr_lydmods_parse (ly_ctx=0x55555558a5c0, initialized=0x7fffffffd544, sr_mods_p=0x7fffffffd560) at /home/focksor/workSpace/sysrepo/src/lyd_mods.c:1067
1067 if (srpjson_get_path(NULL, ly_mod->name, SR_DS_STARTUP, &path)) {
Value returned is $7 = 0
(gdb) p path
$8 = 0x5555555736d0 "/home/focksor/workSpace/sysrepo/build/repository/data/sysrepo.startup"
检查文件 repository/data/sysrepo.startup
,其内容为空,推测是在某次初始化的时候失败导致产生了空白的数据,删除整个文件夹后,数据访问正常。
该问题的解决方法如下:
解决问题的指令如下:
$ sudo rm /dev/shm/sr_*
build$ rm -rf repository/
验证:执行 sysrepoctl -l 正常
$ sysrepoctl -l
Sysrepo repository: /home/focksor/workSpace/sysrepo/build/repository
Module Name | Revision | Flags | Owner | Startup Perms | Submodules | Features
--------------------------------------------------------------------------------------------------------------------------
ietf-datastores | 2018-02-14 | I | focksor:focksor | 444 | |
ietf-factory-default | 2020-08-31 | I | focksor:focksor | 600 | | factory-default-datastore
ietf-inet-types | 2013-07-15 | i | | | |
ietf-netconf | 2013-09-29 | I | focksor:focksor | 644 | |
ietf-netconf-acm | 2018-02-14 | I | focksor:focksor | 600 | |
ietf-netconf-notifications | 2012-02-06 | I | focksor:focksor | 644 | |
ietf-netconf-with-defaults | 2011-06-01 | I | focksor:focksor | 444 | |
ietf-origin | 2018-02-14 | I | focksor:focksor | 444 | |
ietf-yang-library | 2019-01-04 | I | focksor:focksor | 644 | |
ietf-yang-metadata | 2016-08-05 | i | | | |
ietf-yang-schema-mount | 2019-01-14 | I | focksor:focksor | 644 | |
ietf-yang-structure-ext | 2020-06-17 | i | | | |
ietf-yang-types | 2013-07-15 | i | | | |
sysrepo-factory-default | 2023-02-23 | I | focksor:focksor | 600 | |
sysrepo-monitoring | 2022-08-19 | I | focksor:focksor | 600 | |
sysrepo-plugind | 2022-08-26 | I | focksor:focksor | 644 | |
yang | 2022-06-16 | I | focksor:focksor | 444 | |
Flags meaning: I - Installed/i - Imported; R - Replay support