• BCC源码下载


    接前一篇文章:BCC介绍

    1. GitHub地址

    上一篇文章中已提到,BCC的github地址是:https://github.com/iovisor/bcc

    页面如下所示:

    2. 源码下载

    打开终端,创建好要存放BCC源码的目录,进入此目录。
    然后,在终端下输入以下命令进行BCC源码下载:

    git clone https://github.com/iovisor/bcc.git

    实际命令及过程如下所示:

    1. ~/eBPF/BCC$ git clone https://github.com/iovisor/bcc.git
    2. 正克隆到 'bcc'...
    3. remote: Enumerating objects: 28172, done.
    4. remote: Counting objects: 100% (4480/4480), done.
    5. remote: Compressing objects: 100% (565/565), done.
    6. remote: Total 28172 (delta 4035), reused 3938 (delta 3914), pack-reused 23692
    7. 接收对象中: 100% (28172/28172), 19.11 MiB | 137.00 KiB/s, 完成.
    8. 处理 delta 中: 100% (18732/18732), 完成.

    3. 查看源码结构

    1. ~/eBPF/BCC/bcc$ tree
    2. .
    3. ├── cmake
    4. │   ├── bump_version.cmake
    5. │   ├── clang_libs.cmake
    6. │   ├── CmakeUninstall.cmake.in
    7. │   ├── FindCompilerFlag.cmake
    8. │   ├── FindKernelHeaders.cmake
    9. │   ├── FindLibBpf.cmake
    10. │   ├── FindLibDebuginfod.cmake
    11. │   ├── FindLibElf.cmake
    12. │   ├── FindLibLzma.cmake
    13. │   ├── FindLuaJIT.cmake
    14. │   ├── GetGitRevisionDescription.cmake
    15. │   ├── GetGitRevisionDescription.cmake.in
    16. │   ├── static_libstdc++.cmake
    17. │   └── version.cmake
    18. ├── CMakeLists.txt
    19. ├── CODEOWNERS
    20. ├── CONTRIBUTING-SCRIPTS.md
    21. ├── debian
    22. │   ├── bcc-lua.install
    23. │   ├── bcc-tools.install
    24. │   ├── changelog
    25. │   ├── compat
    26. │   ├── control
    27. │   ├── copyright
    28. │   ├── docs
    29. │   ├── libbcc-examples.install
    30. │   ├── libbcc.install
    31. │   ├── python3-bcc.install
    32. │   ├── python-bcc.install
    33. │   ├── rules
    34. │   └── source
    35. │   └── format
    36. ├── docker
    37. │   ├── build
    38. │   │   ├── Dockerfile.fedora
    39. │   │   └── Dockerfile.ubuntu
    40. │   ├── Dockerfile.debian
    41. │   └── Dockerfile.ubuntu
    42. ├── docs
    43. │   ├── kernel_config.md
    44. │   ├── kernel-versions.md
    45. │   ├── reference_guide.md
    46. │   ├── special_filtering.md
    47. │   ├── tutorial_bcc_python_developer.md
    48. │   └── tutorial.md
    49. ├── examples
    50. │   ├── cgroupid
    51. │   │   ├── cgroupid.c
    52. │   │   ├── Dockerfile
    53. │   │   └── Makefile
    54. │   ├── CMakeLists.txt
    55. │   ├── cpp
    56. │   │   ├── CGroupTest.cc
    57. │   │   ├── CMakeLists.txt
    58. │   │   ├── CPUDistribution.cc
    59. │   │   ├── FollyRequestContextSwitch.cc
    60. │   │   ├── HelloWorld.cc
    61. │   │   ├── KFuncExample.cc
    62. │   │   ├── KModRetExample.cc
    63. │   │   ├── LLCStat.cc
    64. │   │   ├── pyperf
    65. │   │   │   ├── CMakeLists.txt
    66. │   │   │   ├── Py36Offsets.cc
    67. │   │   │   ├── PyPerfBPFProgram.cc
    68. │   │   │   ├── PyPerf.cc
    69. │   │   │   ├── PyPerfDefaultPrinter.cc
    70. │   │   │   ├── PyPerfDefaultPrinter.h
    71. │   │   │   ├── PyPerfLoggingHelper.cc
    72. │   │   │   ├── PyPerfLoggingHelper.h
    73. │   │   │   ├── PyPerfSampleProcessor.h
    74. │   │   │   ├── PyPerfType.h
    75. │   │   │   ├── PyPerfUtil.cc
    76. │   │   │   └── PyPerfUtil.h
    77. │   │   ├── RandomRead.cc
    78. │   │   ├── RecordMySQLQuery.cc
    79. │   │   ├── SkLocalStorageIterator.cc
    80. │   │   ├── TaskIterator.cc
    81. │   │   ├── TCPSendStack.cc
    82. │   │   └── UseExternalMap.cc
    83. │   ├── hello_world.py
    84. │   ├── local_storage
    85. │   │   ├── inode_storage.py
    86. │   │   └── task_storage.py
    87. │   ├── lua
    88. │   │   ├── bashreadline.c
    89. │   │   ├── bashreadline.lua
    90. │   │   ├── CMakeLists.txt
    91. │   │   ├── kprobe-latency.lua
    92. │   │   ├── kprobe-write.lua
    93. │   │   ├── memleak.lua
    94. │   │   ├── offcputime.lua
    95. │   │   ├── sock-parse-dns.lua
    96. │   │   ├── sock-parse-http.lua
    97. │   │   ├── sock-protolen.lua
    98. │   │   ├── sock-proto.lua
    99. │   │   ├── strlen_count.lua
    100. │   │   ├── task_switch.lua
    101. │   │   ├── tracepoint-offcputime.lua
    102. │   │   ├── uprobe-readline.lua
    103. │   │   ├── uprobe-readline-perf.lua
    104. │   │   ├── uprobe-tailkt.lua
    105. │   │   └── usdt_ruby.lua
    106. │   ├── networking
    107. │   │   ├── CMakeLists.txt
    108. │   │   ├── distributed_bridge
    109. │   │   │   ├── CMakeLists.txt
    110. │   │   │   ├── main.py
    111. │   │   │   ├── simulation.py -> ../simulation.py
    112. │   │   │   ├── tunnel.c
    113. │   │   │   ├── tunnel_mesh.c
    114. │   │   │   ├── tunnel_mesh.py
    115. │   │   │   └── tunnel.py
    116. │   │   ├── dns_matching
    117. │   │   │   ├── dns_matching.c
    118. │   │   │   └── dns_matching.py
    119. │   │   ├── http_filter
    120. │   │   │   ├── CMakeLists.txt
    121. │   │   │   ├── http-parse-complete.c
    122. │   │   │   ├── http-parse-complete.py
    123. │   │   │   ├── http-parse-simple.c
    124. │   │   │   ├── http-parse-simple.py
    125. │   │   │   └── README.md
    126. │   │   ├── neighbor_sharing
    127. │   │   │   ├── CMakeLists.txt
    128. │   │   │   ├── README.txt
    129. │   │   │   ├── simulation.py -> ../simulation.py
    130. │   │   │   ├── tc_neighbor_sharing.c
    131. │   │   │   └── tc_neighbor_sharing.py
    132. │   │   ├── net_monitor.py
    133. │   │   ├── simple_tc.py
    134. │   │   ├── simulation.py
    135. │   │   ├── sockmap.py
    136. │   │   ├── tc_perf_event.py
    137. │   │   ├── tcp_mon_block
    138. │   │   │   ├── README.md
    139. │   │   │   ├── screenshots
    140. │   │   │   │   ├── 1.JPG
    141. │   │   │   │   └── 2.JPG
    142. │   │   │   └── src
    143. │   │   │   ├── allow_list.json
    144. │   │   │   ├── http_client.py
    145. │   │   │   ├── tcp_mon_block.c
    146. │   │   │   ├── tcp_mon_block.py
    147. │   │   │   └── web_server.py
    148. │   │   ├── tunnel_monitor
    149. │   │   │   ├── chord.png
    150. │   │   │   ├── CMakeLists.txt
    151. │   │   │   ├── main.py
    152. │   │   │   ├── monitor.c
    153. │   │   │   ├── monitor.py
    154. │   │   │   ├── README.md
    155. │   │   │   ├── setup.sh
    156. │   │   │   ├── simulation.py -> ../simulation.py
    157. │   │   │   ├── traffic.sh
    158. │   │   │   └── vxlan.jpg
    159. │   │   ├── vlan_filter
    160. │   │   │   ├── data-plane-tracing.c
    161. │   │   │   ├── data-plane-tracing.py
    162. │   │   │   ├── README.md
    163. │   │   │   ├── scenario.jpg
    164. │   │   │   ├── test_setup.sh
    165. │   │   │   └── test_traffic.sh
    166. │   │   ├── vlan_learning
    167. │   │   │   ├── CMakeLists.txt
    168. │   │   │   ├── README.txt
    169. │   │   │   ├── simulation.py -> ../simulation.py
    170. │   │   │   ├── vlan_learning.c
    171. │   │   │   └── vlan_learning.py
    172. │   │   └── xdp
    173. │   │   ├── CMakeLists.txt
    174. │   │   ├── xdp_drop_count.py
    175. │   │   ├── xdp_macswap_count.py
    176. │   │   ├── xdp_redirect_cpu.py
    177. │   │   └── xdp_redirect_map.py
    178. │   ├── perf
    179. │   │   └── ipc.py
    180. │   ├── ringbuf
    181. │   │   ├── ringbuf_output.py
    182. │   │   └── ringbuf_submit.py
    183. │   ├── tracing
    184. │   │   ├── biolatpcts_example.txt
    185. │   │   ├── biolatpcts.py
    186. │   │   ├── bitehist_example.txt
    187. │   │   ├── bitehist.py
    188. │   │   ├── CMakeLists.txt
    189. │   │   ├── dddos_example.txt
    190. │   │   ├── dddos.py
    191. │   │   ├── disksnoop_example.txt
    192. │   │   ├── disksnoop.py
    193. │   │   ├── hello_fields.py
    194. │   │   ├── hello_perf_output.py
    195. │   │   ├── hello_perf_output_using_ns.py
    196. │   │   ├── kvm_hypercall.py
    197. │   │   ├── kvm_hypercall.txt
    198. │   │   ├── mallocstacks.py
    199. │   │   ├── mysqld_query_example.txt
    200. │   │   ├── mysqld_query.py
    201. │   │   ├── nflatency.py
    202. │   │   ├── nodejs_http_server_example.txt
    203. │   │   ├── nodejs_http_server.py
    204. │   │   ├── stack_buildid_example.py
    205. │   │   ├── stacksnoop_example.txt
    206. │   │   ├── stacksnoop.py
    207. │   │   ├── strlen_count.py
    208. │   │   ├── strlen_hist_ifunc.py
    209. │   │   ├── strlen_hist.py
    210. │   │   ├── strlen_snoop.py
    211. │   │   ├── sync_timing.py
    212. │   │   ├── task_switch.c
    213. │   │   ├── task_switch.py
    214. │   │   ├── tcpv4connect_example.txt
    215. │   │   ├── tcpv4connect.py
    216. │   │   ├── trace_fields.py
    217. │   │   ├── trace_perf_output.py
    218. │   │   ├── undump_example.txt
    219. │   │   ├── undump.py
    220. │   │   ├── urandomread_example.txt
    221. │   │   ├── urandomread-explicit.py
    222. │   │   ├── urandomread.py
    223. │   │   ├── vfsreadlat.c
    224. │   │   ├── vfsreadlat_example.txt
    225. │   │   └── vfsreadlat.py
    226. │   └── usdt_sample
    227. │   ├── CMakeLists.txt
    228. │   ├── scripts
    229. │   │   ├── bpf_text_shared.c
    230. │   │   ├── lat_avg.py
    231. │   │   ├── lat_dist.py
    232. │   │   └── latency.py
    233. │   ├── usdt_sample_app1
    234. │   │   ├── CMakeLists.txt
    235. │   │   └── main.cpp
    236. │   ├── usdt_sample_lib1
    237. │   │   ├── CMakeLists.txt
    238. │   │   ├── include
    239. │   │   │   └── usdt_sample_lib1
    240. │   │   │   └── lib1.h
    241. │   │   └── src
    242. │   │   ├── lib1.cpp
    243. │   │   ├── lib1_sdt.d
    244. │   │   └── lib1_sdt.h
    245. │   ├── usdt_sample.md
    246. │   └── usdt_sample.sh
    247. ├── FAQ.txt
    248. ├── images
    249. │   ├── bcc_tracing_tools_2016.png
    250. │   ├── bcc_tracing_tools_2017.png
    251. │   ├── bcc_tracing_tools_2019.png
    252. │   ├── logo1.png
    253. │   ├── logo1.svg
    254. │   ├── logo2.png
    255. │   └── logo2.svg
    256. ├── INSTALL.md
    257. ├── introspection
    258. │   ├── bps.c
    259. │   ├── bps_example.txt
    260. │   └── CMakeLists.txt
    261. ├── libbpf-tools
    262. │   ├── arm64
    263. │   │   ├── vmlinux_608.h
    264. │   │   └── vmlinux.h -> vmlinux_608.h
    265. │   ├── bashreadline.bpf.c
    266. │   ├── bashreadline.c
    267. │   ├── bashreadline.h
    268. │   ├── bindsnoop.bpf.c
    269. │   ├── bindsnoop.c
    270. │   ├── bindsnoop.h
    271. │   ├── biolatency.bpf.c
    272. │   ├── biolatency.c
    273. │   ├── biolatency.h
    274. │   ├── biopattern.bpf.c
    275. │   ├── biopattern.c
    276. │   ├── biopattern.h
    277. │   ├── biosnoop.bpf.c
    278. │   ├── biosnoop.c
    279. │   ├── biosnoop.h
    280. │   ├── biostacks.bpf.c
    281. │   ├── biostacks.c
    282. │   ├── biostacks.h
    283. │   ├── biotop.bpf.c
    284. │   ├── biotop.c
    285. │   ├── biotop.h
    286. │   ├── bitesize.bpf.c
    287. │   ├── bitesize.c
    288. │   ├── bitesize.h
    289. │   ├── bits.bpf.h
    290. │   ├── blazesym
    291. │   ├── blk_types.h
    292. │   ├── bpftool
    293. │   ├── btf_helpers.c
    294. │   ├── btf_helpers.h
    295. │   ├── cachestat.bpf.c
    296. │   ├── cachestat.c
    297. │   ├── capable.bpf.c
    298. │   ├── capable.c
    299. │   ├── capable.h
    300. │   ├── compat.bpf.h
    301. │   ├── compat.c
    302. │   ├── compat.h
    303. │   ├── core_fixes.bpf.h
    304. │   ├── cpudist.bpf.c
    305. │   ├── cpudist.c
    306. │   ├── cpudist.h
    307. │   ├── cpufreq.bpf.c
    308. │   ├── cpufreq.c
    309. │   ├── cpufreq.h
    310. │   ├── drsnoop.bpf.c
    311. │   ├── drsnoop.c
    312. │   ├── drsnoop_example.txt
    313. │   ├── drsnoop.h
    314. │   ├── errno_helpers.c
    315. │   ├── errno_helpers.h
    316. │   ├── execsnoop.bpf.c
    317. │   ├── execsnoop.c
    318. │   ├── execsnoop.h
    319. │   ├── exitsnoop.bpf.c
    320. │   ├── exitsnoop.c
    321. │   ├── exitsnoop.h
    322. │   ├── filelife.bpf.c
    323. │   ├── filelife.c
    324. │   ├── filelife.h
    325. │   ├── filetop.bpf.c
    326. │   ├── filetop.c
    327. │   ├── filetop.h
    328. │   ├── fsdist.bpf.c
    329. │   ├── fsdist.c
    330. │   ├── fsdist.h
    331. │   ├── fsslower.bpf.c
    332. │   ├── fsslower.c
    333. │   ├── fsslower.h
    334. │   ├── funclatency.bpf.c
    335. │   ├── funclatency.c
    336. │   ├── funclatency.h
    337. │   ├── gethostlatency.bpf.c
    338. │   ├── gethostlatency.c
    339. │   ├── gethostlatency.h
    340. │   ├── hardirqs.bpf.c
    341. │   ├── hardirqs.c
    342. │   ├── hardirqs.h
    343. │   ├── javagc.bpf.c
    344. │   ├── javagc.c
    345. │   ├── javagc.h
    346. │   ├── kernel.config
    347. │   ├── klockstat.bpf.c
    348. │   ├── klockstat.c
    349. │   ├── klockstat.h
    350. │   ├── ksnoop.bpf.c
    351. │   ├── ksnoop.c
    352. │   ├── ksnoop.h
    353. │   ├── llcstat.bpf.c
    354. │   ├── llcstat.c
    355. │   ├── llcstat.h
    356. │   ├── loongarch
    357. │   │   ├── vmlinux_602.h
    358. │   │   └── vmlinux.h -> vmlinux_602.h
    359. │   ├── Makefile
    360. │   ├── Makefile.btfgen
    361. │   ├── map_helpers.c
    362. │   ├── map_helpers.h
    363. │   ├── maps.bpf.h
    364. │   ├── mdflush.bpf.c
    365. │   ├── mdflush.c
    366. │   ├── mdflush.h
    367. │   ├── memleak.bpf.c
    368. │   ├── memleak.c
    369. │   ├── memleak.h
    370. │   ├── mountsnoop.bpf.c
    371. │   ├── mountsnoop.c
    372. │   ├── mountsnoop.h
    373. │   ├── numamove.bpf.c
    374. │   ├── numamove.c
    375. │   ├── offcputime.bpf.c
    376. │   ├── offcputime.c
    377. │   ├── offcputime.h
    378. │   ├── oomkill.bpf.c
    379. │   ├── oomkill.c
    380. │   ├── oomkill.h
    381. │   ├── opensnoop.bpf.c
    382. │   ├── opensnoop.c
    383. │   ├── opensnoop.h
    384. │   ├── powerpc
    385. │   │   ├── vmlinux_600.h
    386. │   │   └── vmlinux.h -> vmlinux_600.h
    387. │   ├── readahead.bpf.c
    388. │   ├── readahead.c
    389. │   ├── readahead.h
    390. │   ├── README.md
    391. │   ├── riscv
    392. │   │   ├── vmlinux_602.h
    393. │   │   └── vmlinux.h -> vmlinux_602.h
    394. │   ├── runqlat.bpf.c
    395. │   ├── runqlat.c
    396. │   ├── runqlat.h
    397. │   ├── runqlen.bpf.c
    398. │   ├── runqlen.c
    399. │   ├── runqlen.h
    400. │   ├── runqslower.bpf.c
    401. │   ├── runqslower.c
    402. │   ├── runqslower_example.txt
    403. │   ├── runqslower.h
    404. │   ├── sigsnoop.bpf.c
    405. │   ├── sigsnoop.c
    406. │   ├── sigsnoop_example.txt
    407. │   ├── sigsnoop.h
    408. │   ├── slabratetop.bpf.c
    409. │   ├── slabratetop.c
    410. │   ├── slabratetop.h
    411. │   ├── softirqs.bpf.c
    412. │   ├── softirqs.c
    413. │   ├── softirqs.h
    414. │   ├── solisten.bpf.c
    415. │   ├── solisten.c
    416. │   ├── solisten.h
    417. │   ├── stat.h
    418. │   ├── statsnoop.bpf.c
    419. │   ├── statsnoop.c
    420. │   ├── statsnoop.h
    421. │   ├── syscall_helpers.c
    422. │   ├── syscall_helpers.h
    423. │   ├── syscount.bpf.c
    424. │   ├── syscount.c
    425. │   ├── syscount.h
    426. │   ├── tcpconnect.bpf.c
    427. │   ├── tcpconnect.c
    428. │   ├── tcpconnect.h
    429. │   ├── tcpconnlat.bpf.c
    430. │   ├── tcpconnlat.c
    431. │   ├── tcpconnlat.h
    432. │   ├── tcplife.bpf.c
    433. │   ├── tcplife.c
    434. │   ├── tcplife.h
    435. │   ├── tcppktlat.bpf.c
    436. │   ├── tcppktlat.c
    437. │   ├── tcppktlat_example.txt
    438. │   ├── tcppktlat.h
    439. │   ├── tcprtt.bpf.c
    440. │   ├── tcprtt.c
    441. │   ├── tcprtt.h
    442. │   ├── tcpstates.bpf.c
    443. │   ├── tcpstates.c
    444. │   ├── tcpstates.h
    445. │   ├── tcpsynbl.bpf.c
    446. │   ├── tcpsynbl.c
    447. │   ├── tcpsynbl.h
    448. │   ├── tcptop.bpf.c
    449. │   ├── tcptop.c
    450. │   ├── tcptop.h
    451. │   ├── tcptracer.bpf.c
    452. │   ├── tcptracer.c
    453. │   ├── tcptracer.h
    454. │   ├── trace_helpers.c
    455. │   ├── trace_helpers.h
    456. │   ├── uprobe_helpers.c
    457. │   ├── uprobe_helpers.h
    458. │   ├── vfsstat.bpf.c
    459. │   ├── vfsstat.c
    460. │   ├── vfsstat.h
    461. │   ├── wakeuptime.bpf.c
    462. │   ├── wakeuptime.c
    463. │   ├── wakeuptime.h
    464. │   └── x86
    465. │   ├── vmlinux_518.h
    466. │   └── vmlinux.h -> vmlinux_518.h
    467. ├── LICENSE.txt
    468. ├── LINKS.md
    469. ├── man
    470. │   ├── CMakeLists.txt
    471. │   └── man8
    472. │   ├── argdist.8
    473. │   ├── bashreadline.8
    474. │   ├── bindsnoop.8
    475. │   ├── biolatency.8
    476. │   ├── biolatpcts.8
    477. │   ├── biopattern.8
    478. │   ├── biosnoop.8
    479. │   ├── biotop.8
    480. │   ├── bitesize.8
    481. │   ├── bpflist.8
    482. │   ├── bps.8
    483. │   ├── btrfsdist.8
    484. │   ├── btrfsslower.8
    485. │   ├── cachestat.8
    486. │   ├── cachetop.8
    487. │   ├── capable.8
    488. │   ├── CMakeLists.txt
    489. │   ├── cobjnew.8 -> uobjnew.8
    490. │   ├── compactsnoop.8
    491. │   ├── cpudist.8
    492. │   ├── cpuunclaimed.8
    493. ……
    494. │   ├── tcpsynbl.bpf.c
    495. │   ├── tcpsynbl.c
    496. │   ├── tcpsynbl.h
    497. │   ├── tcptop.bpf.c
    498. │   ├── tcptop.c
    499. │   ├── tcptop.h
    500. │   ├── tcptracer.bpf.c
    501. │   ├── tcptracer.c
    502. │   ├── tcptracer.h
    503. │   ├── trace_helpers.c
    504. │   ├── trace_helpers.h
    505. │   ├── uprobe_helpers.c
    506. │   ├── uprobe_helpers.h
    507. │   ├── vfsstat.bpf.c
    508. │   ├── vfsstat.c
    509. │   ├── vfsstat.h
    510. │   ├── wakeuptime.bpf.c
    511. │   ├── wakeuptime.c
    512. │   ├── wakeuptime.h
    513. │   └── x86
    514. │   ├── vmlinux_518.h
    515. │   └── vmlinux.h -> vmlinux_518.h
    516. ├── LICENSE.txt
    517. ├── LINKS.md
    518. ├── man
    519. │   ├── CMakeLists.txt
    520. │   └── man8
    521. │   ├── argdist.8
    522. │   ├── bashreadline.8
    523. │   ├── bindsnoop.8
    524. │   ├── biolatency.8
    525. │   ├── biolatpcts.8
    526. │   ├── biopattern.8
    527. │   ├── biosnoop.8
    528. │   ├── biotop.8
    529. │   ├── bitesize.8
    530. │   ├── bpflist.8
    531. │   ├── bps.8
    532. │   ├── btrfsdist.8
    533. │   ├── btrfsslower.8
    534. │   ├── cachestat.8
    535. │   ├── cachetop.8
    536. │   ├── capable.8
    537. │   ├── CMakeLists.txt
    538. │   ├── cobjnew.8 -> uobjnew.8
    539. │   ├── compactsnoop.8
    540. │   ├── cpudist.8
    541. │   ├── cpuunclaimed.8
    542. 82 directories, 1102 files

    至此,BCC源码下载完成。

  • 相关阅读:
    NAS文件的名称或路径过长导致文件同步被挂起
    【C++】STL — vector的使用 + 模拟实现
    gabse 8a常见问题
    软件设计模式系列之五——建造者模式
    动态规划算法的题到底应该怎么做?思路教给你自己写
    Linux网络编程3——多进/线程并发服务器
    CSS 定位布局
    C++多线程同步
    新型基础测绘与实景三维中国建设技术文件【3】基础地理实体空间身份编码规则
    小程序年度盘点&趋势预测
  • 原文地址:https://blog.csdn.net/phmatthaus/article/details/133081029