Sử dụng strace để debug trên linux
TIL
498
System
17
White

huydx viết ngày 11/07/2016

Sử dụng strace để debug trên linux

Trên linux có một công cụ vô cùng hữu ích để debug một process đang chạy gọi là strace. Nhờ có strace mà chúng ta có thể dễ dàng biết được một số thông tin như:

  • Tại sao chương trình stuck
  • Cái gì làm tốn thời gian (readfile, network...)
  • Vô vàn các thông tin thú vị khác

Strace (chắc là) viết tắt của system trace, có nhiệm vụ theo dõi các system call đến hệ thống của linux

Cách dùng dễ nhất:

strace -p <PID>

PID là process id của live process, sau đó strace sẽ cho bạn biết những system call nào đang đc chạy. Ví dụ mình có một process viết bằng go chạy lấy nội dung từ google xuống, strace sẽ cho thông tin

futex(0x927f48, FUTEX_WAIT, 0, NULL)    = 0
epoll_wait(4, [{EPOLLIN|EPOLLOUT, {u32=3290502472, u64=139843130692936}}], 128, 0) = 1
epoll_wait(4, [{EPOLLIN|EPOLLOUT, {u32=3290502472, u64=139843130692936}}], 128, -1) = 1
futex(0x9275b0, FUTEX_WAKE, 1)          = 1
read(5, "1\333Pu\211_\213\201\35\212\307\6(^\355 \260=HF[/\220\"\17\220\214G8\3\342\271"..., 4096) = 1294
futex(0xc8200c4108, FUTEX_WAKE, 1)      = 1
futex(0xc820024908, FUTEX_WAKE, 1)      = 1
read(5, 0xc820104000, 4096)             = -1 EAGAIN (Resource temporarily unavailable)
write(3, "GET / HTTP/1.1\r\nHost: google.com"..., 91) = 91
futex(0x927f48, FUTEX_WAIT, 0, NULL)    = 0
futex(0x927f48, FUTEX_WAIT, 0, NULL)    = 0
futex(0x927f48, FUTEX_WAIT, 0, NULL)    = 0
epoll_wait(4, [{EPOLLIN|EPOLLOUT, {u32=3290502472, u64=139843130692936}}], 128, 0) = 1
epoll_wait(4, [{EPOLLOUT, {u32=3290502472, u64=139843130692936}}], 128, -1) = 1
epoll_wait(4, [{EPOLLIN|EPOLLOUT, {u32=3290502856, u64=139843130693320}}], 128, -1) = 1
futex(0x9275b0, FUTEX_WAKE, 1)          = 1
read(3, "HTTP/1.1 302 Found\r\nCache-Contro"..., 4096) = 477
futex(0xc820024908, FUTEX_WAKE, 1)      = 1
read(3, 0xc8200e4000, 4096)             = -1 EAGAIN (Resource temporarily unavailable)
write(5, "GET /?gfe_rd=cr&ei=MEyDV_2_F_Hd8"..., 161) = 161

Các bạn có thể dễ dàng thấy các system call liên quan đến http/net như epoll hay là write.

Thêm flag -c vào các bạn có thể biết system call nào đang take time:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 58.29    0.024293          75       323         4 futex
 28.79    0.012000       12000         1         1 restart_syscall
 11.56    0.004817          32       151           epoll_wait
  0.73    0.000305          61         5           select
  0.63    0.000263           2       129        56 read
  0.00    0.000000           0        39           write
  0.00    0.000000           0         1           sched_yield
------ ----------- ----------- --------- --------- ----------------
100.00    0.041678                   649        61 total

Dựa vào strace cũng có thể biết một process mở file nào, ví dụ với mysql

$ strace mysql 2>&1  | grep 'open' | grep '.cnf'
open("/etc/mysql/my.cnf", O_RDONLY|O_LARGEFILE) = 3
open("/home/sonots/.my.cnf", O_RDONLY|O_LARGEFILE) = 3

Ngoài strace ra thì sử dụng thông tin trong /proc/PID cũng rất hữu ích để debug. Tham khảo
http://blog.tanelpoder.com/2013/02/21/peeking-into-linux-kernel-land-using-proc-filesystem-for-quickndirty-troubleshooting/

huydx 11-07-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

115 bài viết.
858 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
135 8
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết hơn 1 năm trước
135 8
White
109 14
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết gần 3 năm trước
109 14
White
86 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết hơn 2 năm trước
86 10
Bài viết liên quan
White
7 3
Đã có rất nhiều bài viết về process trên linux trên kipalog https://kipalog.com/posts/HedieuhanhProcess https://kipalog.com/posts/GioithieuveUN...
LinhPT viết 12 tháng trước
7 3
White
6 4
Ý nghĩa vm.swappiness là một biến trong Linux kernel điều khiển khi nào Linux kernel nên swap một page ra khỏi bộ nhớ đang sử dụng. Giá trị này c...
Bùi Hồng Hà viết gần 3 năm trước
6 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
115 bài viết.
858 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!