gdb如何调试ceph的radosgw

73次阅读
没有评论

共计 7240 个字符,预计需要花费 19 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 gdb 如何调试 ceph 的 radosgw,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

#gdb 调试 rgw

修改 gdb 配置,设置为保存历史命令,p 变量美化输出等

[root@ceph04 src]# cat ~/.gdbinit
set history save on 
set print pretty on
set pagination off
set confirm off

切换到 ceph04(10.254.3.81)的 /home/yuliyang/ceph/src [root@ceph04 src]# pwd /home/yuliyang/ceph/src 使用 vstart 方式启动一个集群

./vstart.sh -d -n -X -r --short

创建 admin 用户

./radosgw-admin user create --uid=admin --display-name=admin --access-key=admin --secret=admin

rgw 在 8000 端口 ps 查看进程号

[root@ceph04 src]# ps aux|grep ceph
root 10486 1.5 0.1 404376 201076 pts/2 Sl 11:40 1:22 ./ceph-mon -i a -c /home/yuliyang/ceph/src/ceph.conf
root 10501 0.9 0.1 413592 202224 pts/2 Sl 11:40 0:54 ./ceph-mon -i b -c /home/yuliyang/ceph/src/ceph.conf
root 10520 0.9 0.1 413592 201968 pts/2 Sl 11:40 0:51 ./ceph-mon -i c -c /home/yuliyang/ceph/src/ceph.conf
root 10854 0.6 0.1 899744 226972 ? Ssl 11:40 0:35 ./ceph-osd -i 0 -c /home/yuliyang/ceph/src/ceph.conf
root 11067 0.6 0.1 899748 226280 ? Ssl 11:40 0:34 ./ceph-osd -i 1 -c /home/yuliyang/ceph/src/ceph.conf
root 11304 0.5 0.1 898720 222624 ? Ssl 11:40 0:31 ./ceph-osd -i 2 -c /home/yuliyang/ceph/src/ceph.conf
root 11634 0.0 0.1 351560 157888 ? Ssl 11:40 0:01 ./ceph-mds -i a -c /home/yuliyang/ceph/src/ceph.conf
root 11723 0.0 0.1 383336 164808 ? Ssl 11:40 0:03 ./ceph-mds -i b -c /home/yuliyang/ceph/src/ceph.conf
root 11826 0.0 0.1 351556 158000 ? Ssl 11:40 0:01 ./ceph-mds -i c -c /home/yuliyang/ceph/src/ceph.conf
root 12282 0.1 0.1 12470764 209416 ? Ssl 11:40 0:05 /home/yuliyangceph/src/.libs/lt-radosgw -c /home/yuliyang/ceph/src/ceph.conf --log-file=/home/yuliyang/ceph/src/out/rgw.log --debug-rgw=20 --debug-ms=1
root 22717 0.0 0.0 112648 952 pts/2 S+ 13:11 0:00 grep --color=auto ceph

attach 进程

gdb attach 12282

打断点

(gdb) b process_request
Breakpoint 1 at 0x7f465253ea20: file rgw/rgw_process.cc, line 37.
(gdb) b rgw/rgw_process.cc:38
Breakpoint 2 at 0x7f465253ea2f: file rgw/rgw_process.cc, line 38.
(gdb) b rgw/rgw_process.cc:39
Breakpoint 3 at 0x7f465253ea39: file rgw/rgw_process.cc, line 39.

运行

(gdb) c
Continuing.
[New Thread 0x7f462c7f8700 (LWP 23422)]
[Thread 0x7f463c1ae700 (LWP 21983) exited]
[Thread 0x7f463c5b2700 (LWP 21980) exited]
[New Thread 0x7f465c472700 (LWP 23425)]

卡住在此。。。执行创建 100 个桶,间隔 1000s

for i in `seq 1 100`;do s3cmd -c yuliyang.s3cfg mb s3://test-$i ;sleep 1000 ;done;

在断点处停住

(gdb) c
Continuing.
[New Thread 0x7f462c7f8700 (LWP 23422)]
[Thread 0x7f463c1ae700 (LWP 21983) exited]
[Thread 0x7f463c5b2700 (LWP 21980) exited]
[New Thread 0x7f465c472700 (LWP 23425)]
[Switching to Thread 0x7f453affd700 (LWP 12363)]
Breakpoint 1, process_request (store=0x7f465dd42840, rest=0x7ffd760c17e0, req=0x7f453affa800, client_io=0x7f453affa940, olog=0x0) at rgw/rgw_process.cc:37
37 {(gdb)

ctr x a 打开 tui 发现停在断点处

n 下一步,继续若干 n 后

查看 userinfo

(gdb) p userinfo
$2 = {
 auid = 0, 
 user_id = {
 tenant =  , 
 id =  
 }, 
 display_name =  , 
 user_email =  , 
 access_keys = std::map with 0 elements, 
 swift_keys = std::map with 0 elements, 
 subusers = std::map with 0 elements, 
 suspended = 0  \000 , 
 max_buckets = 1000, 
 op_mask = 7, 
 caps = {
 caps = std::map with 0 elements
 }, 
 system = 0  \000 , 
 default_placement =  , 
 placement_tags = empty std::list, 
 bucket_quota = {
 max_size_kb = -1, 
 max_objects = -1, 
 enabled = false, 
 max_size_soft_threshold = -1, 
 max_objs_soft_threshold = -1
 }, 
 temp_url_keys = std::map with 0 elements, 
 user_quota = {
 max_size_kb = -1, 
 max_objects = -1, 
 enabled = false, 
 max_size_soft_threshold = -1, 
 max_objs_soft_threshold = -1
 }
}

list 查看当前断点处周围的代码

(gdb) list
56 s- obj_ctx =  rados_ctx;
58 s- req_id = store- unique_id(req- 
59 s- trans_id = store- unique_trans_id(req- 
60 s- host_id = store- host_id;
62 req- log_format(s,  initializing for trans_id = %s , s- trans_id.c_str());
64 RGWOp* op = NULL;
65 int init_error = 0;

继续 n 执行, 查看 * s 变量

(gdb) p *s
$3 = {
 cct = 0x7f465dcc5e10, 
 cio = 0x0, 
 req = 0x6, 
 op = OP_UNKNOWN, 
 op_type = RGW_OP_UNKNOWN, 
 content_started = false, 
 format = 0, 
 formatter = 0x0, 
 decoded_uri =  , 
 relative_uri =  , 
 length = 0x0, 
 content_length = 0, 
 generic_attrs = std::map with 0 elements, 
 err = {
 http_ret = 200, 
 ret = 0, 
 s3_code =  , 
 message =  
 }, 
 expect_cont = false, 
 header_ended = false, 
 obj_size = 0, 
 enable_ops_log = false, 
 enable_usage_log = false, 
 defer_to_bucket_acls = 0  \000 , 
 perm_mask = 0, 
 header_time = {
 tv = {
 tv_sec = 0, 
 tv_nsec = 0
 }
 }, 
 account_name =  , 
 bucket_tenant =  , 
 bucket_name =  , 
 bucket = {
 tenant =  , 
 name =  , 
 data_pool =  , 
 data_extra_pool =  , 
 index_pool =  , 
 marker =  , 
 bucket_id =  , 
 oid =  
 }, 
 object = {
 name =  , 
 instance =  
 }, 
 src_tenant_name =  , 
 src_bucket_name =  , 
 src_object = {
 name =  , 
 instance =  
 }, 
 bucket_owner = {
 id = {
 tenant =  , 
 id =  
 }, 
 display_name =  
 }, 
 owner = {
 id = {
 tenant =  , 
 id =  
 }, 
 display_name =  
 }, 
 zonegroup_name =  , 
 zonegroup_endpoint =  , 
 bucket_instance_id =  , 
 bucket_instance_shard_id = -1, 
 redirect =  , 
 bucket_info = {
 bucket = {
 tenant =  , 
 name =  , 
 data_pool =  , 
 data_extra_pool =  , 
 index_pool =  , 
 marker =  , 
 bucket_id =  , 
 oid =  
 }, 
 owner = {
 tenant =  , 
 id =  
 }, 
 flags = 0, 
 zonegroup =  , 
 creation_time = {
 __d = {
 __r = 0
 }
 }, 
 placement_rule =  , 
 has_instance_obj = false, 
 objv_tracker = {
 read_version = {
 ver = 0, 
 tag =  
 }, 
 write_version = {
 ver = 0, 
 tag =  
 }
 }, 
 ep_objv = {
 ver = 0, 
 tag =  
 }, 
 quota = {
 max_size_kb = -1, 
 max_objects = -1, 
 enabled = false, 
 max_size_soft_threshold = -1, 
 max_objs_soft_threshold = -1
 }, 
 num_shards = 0, 
 bucket_index_shard_hash_type = 0  \000 , 
 static NUM_SHARDS_BLIND_BUCKET = 4294967295, 
 requester_pays = false, 
 has_website = false, 
 website_conf = {
 redirect_all = {
 protocol =  , 
 hostname =  , 
 http_redirect_code = 0
 }, 
 index_doc_suffix =  , 
 error_doc =  , 
 routing_rules = {
 rules = empty std::list
 }
 }, 
 index_type = (unknown: 805334416), 
 swift_versioning = false, 
 swift_ver_location =  
 }, 
 bucket_attrs = std::map with 0 elements, 
 bucket_exists = false, 
 has_bad_meta = false, 
 user = 0x7f453affa060, 
 bucket_acl = 0x0, 
 object_acl = 0x0, 
 system_request = false, 
 aws4_auth_needs_complete = false, 
 aws4_auth = 0x0, 
 canned_acl =  , 
 has_acl_header = false, 
 http_auth = 0x0, 
 local_source = false, 
 prot_flags = 0, 
 os_auth_token = 0x0, 
 swift_user =  , 
 swift_groups =  , 
 content_disp = {
 override =  , 
 fallback =  
 }, 
 host_id =  , 
 info = {
 env = 0x7f453affa950, 
 args = {
 str =  , 
 empty_str =  , 
 val_map = std::map with 0 elements, 
 sys_val_map = std::map with 0 elements, 
 sub_resources = std::map with 0 elements, 
 has_resp_modifier = false, 
 admin_subresource_added = false
 }, 
 x_meta_map = std::map with 0 elements, 
 host =  127.0.0.1 , 
 method = 0x7f4530017e38  PUT , 
 script_uri =  /test-1/ , 请求创建的桶名字
 request_uri =  /test-1/ , 
 request_uri_aws4 =  , 
 effective_uri =  , 
 request_params =  , 
 domain =  
 }, 
 init_state = {
 url_bucket =  , 
 src_bucket =  
 }, 
 time = {
 tv = {
 tv_sec = 1470979550, 
 tv_nsec = 592751627
 }
 }, 
 obj_ctx = 0x0, 
 dialect =  , 
 req_id =  , 
 trans_id =  
}

查看结构体 * s 的其他信息

(gdb) p (*s).req_id
$4 =  8e78e271-aa38-4121-bfc5-c9a74b816fc5.4115.9 
(gdb) p (*s).trans_id
$5 =  tx ,  0   repeats 20 times ,  9-0057ad5e60-1013-default 
(gdb) p (*s).host_id 
$6 = 

继续 n,直到 get_handler 函数,按 s 进入函数

因为是 put 类型

直接 break 退出 查看 op 类型是 create_bucket

查看当前线程

(gdb) thread

[Current thread is 106 (Thread 0x7f4538ff9700 (LWP 12367))]

q 退出

看完了这篇文章,相信你对“gdb 如何调试 ceph 的 radosgw”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计7240字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)