2

我正在使用主线内核 5.12 在 Ubuntu 20.04 上尝试loti-examples(Uring 之王)提交 8724d47 和 liburing 提交 7ff4fee。

我将以下补丁用于 loti-examples 以获得更好的调试体验:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0c857b6..0afcbe3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.15)
 project(liburing_examples C)
 
 set(CMAKE_C_STANDARD 99)
+set(CMAKE_BUILD_TYPE Debug)
+SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -ggdb3") 
 
 add_executable(probe probe.c)
 target_link_libraries(probe uring)

构建后,我启动gdb build/webserver_liburing了,这就是我正在做的事情:

(gdb) start
[omitted]
(gdb) break io_uring_sqe_set_data
Breakpoint 2 at 0x5555555556ec: file /usr/include/liburing.h, line 200.
(gdb) break 441
Breakpoint 3 at 0x555555556acb: file /home/janus/Skrivebord/artemis/loti-examples/webserver_liburing.c, line 441.
(gdb) c
Continuing.
Minimum kernel version required is: 5.5
Your kernel version is: 5.12
ZeroHTTPd listening on port: 8000

Breakpoint 2, io_uring_sqe_set_data (sqe=0x7ffff7fc2000, data=0x55555555c6b0) at /usr/include/liburing.h:200
200     sqe->user_data = (unsigned long) data;
(gdb) p data
$1 = (void *) 0x55555555c6b0
(gdb) c
Continuing.

Breakpoint 3, server_loop (server_socket=3) at /home/janus/Skrivebord/artemis/loti-examples/webserver_liburing.c:441
441         struct request *req = (struct request *) io_uring_cqe_get_data(cqe);
(gdb) p cqe->user_data
Cannot access memory at address 0x7ffff7fc6140
(gdb) p ret
$5 = 0

我正在尝试验证request在提交队列上发送的指针是否与在完成队列上返回的指针相同。

因此,在第 441 行的断点处,您可以从 gdb 输出的最后一行看到,调用io_uring_wait_cqe成功,因为它的返回值ret为零。那么为什么我不能cqe->user_data用 gdb 阅读呢?我希望它包含与在第一个断点上提交到提交队列的地址相同的地址,并绑定到当时的名称data

编辑 5 月 12 日:

Mark Plotnick 暗示该地址可以是 I/O 映射的,实际上它是:

(gdb) x cqe
0x7ffff7fc6140: Cannot access memory at address 0x7ffff7fc6140
(gdb) info proc mappings
[...]
  0x7ffff7fc2000     0x7ffff7fc6000     0x4000 0x10000000 anon_inode:[io_uring]
  0x7ffff7fc6000     0x7ffff7fc9000     0x3000        0x0 anon_inode:[io_uring]
[...]
4

0 回答 0