最新要闻
- 要闻:14年了:“千年老二”微软终于有机会扳倒谷歌搜索
- 热消息:微星推出Cubi 5 12M迷你主机:仅0.66L、配备双网口
- 世界热点评!女生应聘被问是否单身!当事公司:要求单身正常 将起诉举报者
- 【全球时快讯】近50年来首次!日本沙滩惊现大量沙丁鱼 原因未知:开排核废水、也要大地震?
- 最新资讯:国产车开门红:1月比亚迪称王 大众沦落第三 合资腰斩
- 当前报道:自研指令集没有侵权MIPS 国产CPU龙芯赢了:摆脱官司
- 当前讯息:自燃车辆引燃邻车 损失谁来赔?法院释疑
- 华硕发布新款Vivobook 13 Slate笔记本:Intel 7W超低功耗U
- 今日精选:3岁女童喊脚疼被确诊癌症晚期:神经母细胞瘤 儿童癌症之王
- 天天微速讯:剧版《三体》弹幕互动量破2000万!豆瓣涨至8.3分
- 【热闻】iPhone 15 Ultra狂堆料!价格可能贵出天际
- 环球热议:全球不足50人!宝鸡发现1例罕见黄金血型:比熊猫血更稀有
- 强震已致超7700人遇难!土耳其地震背后的人祸 建筑不达标、豆腐渣工程多
- 全球热议:全球首架国产大飞机C919首飞三亚 民航最高接待礼“过水门”接风
- 环球关注:iPhone 15 Pro系列拿到三星顶级屏幕!超出S23系列整整两代
- 免费无广告 微软电脑管家2.7公测版发布:任务栏被意外修改有救了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Linux内核跟踪和性能分析
尽管通过打印进行调试可以满足大多数调试需求,但在某些情况下,我们需要在运行时监视Linux内核以跟踪奇怪的行为,包括延迟、CPU占用、调度问题等等。在Linux世界中,实现这一点最有用的工具是内核本身的一部分。最重要的是ftrace,这是一种Linux内核内部跟踪工具,也是本文章的主要主题。
使用Ftrace来检测代码
函数跟踪(Function Trace),简称为Ftrace,它的作用远不止它的名字。例如,它可以用来测量处理中断所花费的时间,跟踪耗时的功能,计算激活高优先级任务的时间,跟踪上下文切换,等等。
(相关资料图)
Ftrace由Steven Rostedt开发,自2008年2.6.27版本以来一直包含在内核中。这个框架为记录数据提供了一个调试环缓冲区。这些数据是由内核集成的跟踪程序收集的。Ftrace工作在debugfs文件系统之上,大多数情况下,当它被启用时,它被挂载在自己的名为tracing的目录中。在大多数现代Linux发行版中,它默认挂载在/sys/kernel/debug/目录下(仅对root用户可用),这意味着您可以在/sys/kernel/debug/tracing/中使用Ftrace。
为了在您的系统上支持Ftrace,需要启用以下内核选项:
CONFIG_FUNCTION_TRACERCONFIG_FUNCTION_GRAPH_TRACERCONFIG_STACK_TRACERCONFIG_DYNAMIC_FTRACE
上述选项依赖于通过启用CONFIG_HAVE_FUNCTION_TRACER、CONFIG_HAVE_DYNAMIC_FTRACE和CONFIG_HAVE_FUNCTION_GRAPH_TRACER选项来支持跟踪特性的体系结构。
要挂载tracefs目录,您可以在/etc/fstab文件中添加以下一行:
tracefs /sys/kernel/debug/tracing tracefs defaults 0 0
或者你可以在运行时使用以下命令来挂载它:
mount -t tracefs nodev /sys/kernel/debug/tracing
目录的内容应该是这样的:
# ls /sys/kernel/debug/tracing/README set_event_pidavailable_events set_ftrace_filteravailable_filter_functions set_ftrace_notraceavailable_tracers set_ftrace_pidbuffer_size_kb set_graph_functionbuffer_total_size_kb set_graph_notracecurrent_tracer snapshotdyn_ftrace_total_info stack_max_sizeenabled_functions stack_traceevents stack_trace_filterfree_buffer tracefunction_profile_enabled trace_clockinstances trace_markermax_graph_depth trace_optionsoptions trace_pipeper_cpu trace_statprintk_formats tracing_cpumasksaved_cmdlines tracing_max_latencysaved_cmdlines_size tracing_onset_event tracing_thresh
我们不会描述所有这些文件和子目录,因为在官方文档中已经介绍过了。相反,我们将简单描述与上下文相关的文件:
- available_tracers:可用的跟踪程序。
- tracing_cumask:允许跟踪选定的CPUs。掩码应该以十六进制字符串格式指定。例如,要只跟踪core 0,您应该在该文件中包含1。要跟踪core 1,应该在其中包含一个2。对于core 3,应该包括数字8。
- current_tracer:当前正在运行的跟踪程序。
- tracing_on:负责启用或禁用向环形缓冲区写入数据的系统文件(要启用此功能,必须将数字1添加到文件中;若要禁用它,则添加数字0)。
- trace:以人类可读格式保存跟踪数据的文件。
既然我们已经介绍了Ftrace并描述了它的功能,那么我们就可以深入研究它的用法,了解它在跟踪和调试方面有多么有用。
可用的tracers
我们可以使用以下命令查看可用的tracers列表:
# cat /sys/kernel/debug/tracing/available_tracersblk mmiotrace function_graph wakeup_dl wakeup_rt wakeup irqsoff function nop
让我们快速了解一下每种tracer的特点:
- function:没有参数的函数调用tracer。
- function_graph:带有子调用的函数调用tracer。
- blk:与块设备I/O操作相关的调用和事件tracer(这就是blktrace所使用的)。
- mmiotrace:内存映射的I/O操作tracer。它跟踪一个模块对硬件的所有调用。它是通过CONFIG_MMIOTRACE启用的,这取决于CONFIG_HAVE_MMIOTRACE_SUPPORT。
- irqsoff:跟踪禁用中断的区域,并保存最大延迟时间最长的跟踪。这个跟踪程序依赖于CONFIG_IRQSOFF_TRACER。
- preemptoff:取决于CONFIG_PREEMPT_TRACER。它类似于irqsoff,但是跟踪并记录禁用抢占的时间。
- preemtirqsoff:类似于irqsoff和preemptoff,但它跟踪并记录禁用irqs和/或抢占的最大时间。
- CONFIG_SCHED_TRACER启用的wakeup和wakeup_rt:前者跟踪并记录最高优先级任务在被唤醒后被调度所需的最大延迟,而后者跟踪并记录仅用于实时(RT)任务所需的最大延迟(与当前唤醒跟踪程序的方式相同)。
- nop:最简单的跟踪器,顾名思义,它什么都不做。nop跟踪程序只是显示trace_printk()调用的输出。
irqsoff、preemptoff和preemtirqsoff是所谓的延迟跟踪器。它们测量中断被禁用多长时间,抢占被禁用多长时间,以及中断和/或抢占被禁用多长时间。Wakeup延迟跟踪器测量一个进程在被所有任务或RT任务唤醒后需要多长时间才能运行。
The function tracer
我们将从函数跟踪器开始介绍Ftrace。让我们来看一个测试脚本:
# cd /sys/kernel/debug/tracing# echo function > current_tracer# echo 1 > tracing_on# sleep 1# echo 0 > tracing_on# less trace
这个脚本相当简单,但有几件事值得注意。我们通过将当前跟踪程序的名称写入current_tracer文件来启用当前跟踪程序。接下来,我们将1写入tracing_on,这将启用循环缓冲区。语法要求在1和>之间有个空格,“echo1> tracing_on”将不能工作。一行之后,我们禁用它(如果将0写入tracing_on,缓冲区将不会被清除,Ftrace也不会被禁用)。
我们为什么要这么做?在两个echo命令之间,我们看到sleep 1命令。我们启用缓冲区,运行这个命令,然后禁用它。这使得跟踪程序可以包含与命令运行时发生的所有系统调用相关的信息。在脚本的最后一行中,我们给出在控制台中显示跟踪数据的命令。一旦脚本运行,我们将看到以下打印输出(这只是一个小片段):
打印输出以缓冲区中的条目数量和写入的条目总数相关的信息开始。这两个数字之间的差就是填充缓冲区时丢失的事件数。然后,有一个包含以下信息的函数列表:
- 进程名(TASK)。
- 进程标识符(PID)。
- 进程运行的CPU (CPU#)。
- 函数开始时间(TIMESTAMP)。这个时间戳是自启动以来的时间。
- 被跟踪函数的名称(FUNCTION)和在 "<-" 符号后面被调用的父函数。例如,在输出的第一行中,irq_may_run函数是由handle_fasteoi_irq调用的。
现在我们已经熟悉了函数跟踪器及其特性,我们可以了解下一个跟踪器,它具有更丰富的特性,并提供更多的跟踪信息,例如调用graph。
The function_graph tracer
function_graph tracer的工作方式就像function tracer一样,但是以更详细的方式:显示每个函数的入口和出口点。使用这个跟踪器,我们可以跟踪带有子调用的函数,并测量每个函数的执行时间。
让我们编辑前面例子中的脚本:
# cd /sys/kernel/debug/tracing# echo function_graph > current_tracer# echo 1 > tracing_on# sleep 1# echo 0 > tracing_on# less trace
运行这个脚本后,我们得到以下打印输出:
# tracer: function_graph## CPU DURATION FUNCTION CALLS# | | | | | | | 5) 0.400 us | } /* set_next_buddy */ 5) 0.305 us | __update_load_avg_se(); 5) 0.340 us | __update_load_avg_cfs_rq(); 5) | update_cfs_group() { 5) | reweight_entity() { 5) | update_curr() { 5) 0.376 us | __calc_delta(); 5) 0.308 us | update_min_vruntime(); 5) 1.754 us | } 5) 0.317 us | account_entity_dequeue(); 5) 0.260 us | account_entity_enqueue(); 5) 3.537 us | } 5) 4.221 us | } 5) 0.261 us | hrtick_update(); 5) + 16.852 us | } /* dequeue_task_fair */ 5) + 23.353 us | } /* deactivate_task */ 5) | pick_next_task_fair() { 5) 0.286 us | update_curr(); 5) 0.271 us | check_cfs_rq_runtime(); 5) | pick_next_entity() { 5) 0.441 us | wakeup_preempt_entity.isra.77(); 5) 0.306 us | clear_buddies(); 5) 1.645 us | }------------------------------------------ 5) SCTP ti-27174 => Composi-2089------------------------------------------ 5) 0.632 us | __switch_to_xtra(); 5) 0.350 us | finish_task_switch(); 5) ! 271.440 us | } /* schedule */ 5) | _cond_resched() { 5) 0.267 us | rcu_all_qs(); 5) 0.834 us | } 5) ! 273.311 us | } /* futex_wait_queue_me */
在这个图中,DURATION表示运行一个函数所花费的时间。注意 + 和 !符号。加号(+)表示函数耗时超过10微秒,而感叹号(!)表示耗时超过100微秒。在FUNCTION_CALLS下面,我们找到与每个函数调用相关的信息。用于显示每个函数的起始和完成的符号与C编程语言中的相同:括号({})划分函数,一个在开始,一个在结束;不调用任何其他函数的叶子函数用分号(;)标记。
Ftrace还允许使用tracing_thresh选项将跟踪限制在超过一定时间的函数上。应该记录函数的时间阈值必须以微秒单位写入该文件。这可以用来查找内核中花费很长时间的例程。在内核启动时使用它可能很有趣,可以帮助优化启动时间。要在启动时设置阈值,可以在内核命令行中设置,如下所示:
tracing_thresh=200 ftrace=function_graph
这将跟踪所有耗时超过200微秒(0.2毫秒)的函数。您可以使用任何时间间隔的阈值。
在运行时,您可以简单地执行echo 200 > tracing_thresh。
Function filters
选择要跟踪的函数。不用说,要跟踪的函数越少,开销就越少。Ftrace打印输出可能很大,并且找到您正在寻找的内容可能非常困难。但是,我们可以使用过滤器来简化搜索:打印输出只显示我们感兴趣的函数的信息。要做到这一点,我们只需要在set_ftrace_filter文件中写入函数名,如下所示:
# echo kfree > set_ftrace_filter
要禁用过滤器,我们在这个文件中添加一个空行:
# echo > set_ftrace_filter
执行如下命令:
# echo kfree > set_ftrace_notrace
结果相反:打印输出将为我们提供除kfree()之外的所有函数的信息。另一个有用的选项是set_ftrace_pid。此工具用于跟踪可以代表特定进程调用的函数。
Ftrace有更多筛选选项。要了解更详细的信息,您可以在https://www.kernel.org/doc/Documentation/trace/ftrace.txt上阅读官方文档。
Tracing events
在介绍跟踪事件之前,让我们讨论一下跟踪点(tracepoints)。跟踪点是触发系统事件的特殊代码插入。跟踪点可以是动态的(意味着它们附加了几个检查),也可以是静态的(没有附加检查)。
静态跟踪点不会以任何方式影响系统;它们只是在检测函数的末尾为函数调用添加了几个字节,并在单独的部分中添加了一个数据结构。动态跟踪点在执行相关代码片段时调用跟踪函数。跟踪数据被写入循环缓冲区。跟踪点可以包含在代码中的任何地方。事实上,它们已经可以在很多内核函数中找到。让我们看看摘自mm/slab.c的kmem_cache_free函数:
void kmem_cache_free(struct kmem_cache *cachep, void *objp){ [...] trace_kmem_cache_free(_RET_IP_, objp);}
kmem_cache_free本身就是一个跟踪点。只要看看其他内核函数的源代码,我们就能找到无数的例子。
Linux内核有一个特殊的API用于处理来自用户空间的跟踪点。在“/sys/kernel/debug/tracing”目录下,有一个存放系统事件的“events”目录。这些可用于跟踪。在这个上下文中,系统事件可以理解为内核中包含的跟踪点。
可以通过运行以下命令查看这些列表:
# cat /sys/kernel/debug/tracing/available_eventsmac80211:drv_return_voidmac80211:drv_return_intmac80211:drv_return_boolmac80211:drv_return_u32mac80211:drv_return_u64mac80211:drv_startmac80211:drv_get_et_stringsmac80211:drv_get_et_sset_countmac80211:drv_get_et_statsmac80211:drv_suspend[...]
一个很长的列表将在控制台中打印出来,使用
# ls /sys/kernel/debug/tracing/eventsblock gpio napi regmap syscallscfg80211 header_event net regulator taskclk header_page oom rpm timercompaction i2c pagemap sched udpenable irq power signal vmscanfib kmem printk skb workqueuefilelock mac80211 random sock writebackfilemap migrate raw_syscalls spiftrace module rcu swiotlb
所有可能的事件在子目录中按子系统组合。在开始跟踪事件之前,我们将确保已启用向循环缓冲区写入。
关于hrtimers,通过列出/sys/kernel/debug/tracing/events/timer的内容,我们将拥有timer-related跟踪点,包括hrtimer-related跟踪点,如下所示:
# ls /sys/kernel/debug/tracing/events/timerenable hrtimer_init timer_cancelfilter hrtimer_start timer_expire_entryhrtimer_cancel itimer_expire timer_expire_exithrtimer_expire_entry itimer_state timer_inithrtimer_expire_exit tick_stop timer_start
现在让我们跟踪对hrtimer-related内核函数的访问。对于我们的跟踪程序,我们将使用nop,因为function和function_graph记录了太多信息,包括我们不感兴趣的事件信息。下面是我们将使用的脚本:
# cd /sys/kernel/debug/tracing/# echo 0 > tracing_on# echo > trace# echo nop > current_tracer# echo 1 > events/timer/enable# echo 1 > tracing_on;# sleep 1;# echo 0 > tracing_on;# echo 0 > events/timer/enable# less trace
我们首先禁用跟踪,以防它已经在运行。然后,在将当前跟踪器设置为nop之前,清除环形缓冲区数据。接下来,我们启用timer-related跟踪点,或者应该说,启用timer event跟踪。最后,我们启用跟踪并转储环形缓冲区的内容,如下所示:
在打印输出的最后,我们将找到有关hrtimer函数调用的信息(这里是一小部分)。关于配置事件跟踪的更多详细信息可以在这里找到:https://www.kernel.org/doc/Documentation/trace/events.txt。
使用Ftrace接口跟踪特定进程
使用Ftrace可以让您拥有启用跟踪的内核跟踪点/函数,而不管这些函数是代表哪个进程运行的。为了只跟踪代表特定函数执行的内核函数,应该将set_ftrace_pid变量设置为进程的进程ID (PID),例如,可以使用pgrep获得该进程ID。如果进程尚未运行,您可以使用包装器shell脚本和exec命令作为已知PID执行命令,如下所示:
#!/bin/shcd /sys/kernel/debug/tracing/echo > traceecho nop > current_tracerecho "pid=$$"echo $$ > set_ftrace_pid# [can set other filtering here]echo function_graph > current_tracerecho 1 > tracing_onexec $*echo 0 > tracing_on
在上面的例子中,$$是当前执行进程(shell脚本本身)的PID。这是在set_ftrace_pid变量中设置的,然后启用function_graph跟踪程序,然后脚本执行命令(由脚本的第一个参数指定)。
假设脚本名为trace_process.sh,使用示例如下:
sudo ./trace_process.sh ls
现在我们熟悉了跟踪事件和跟踪点。我们能够跟踪和跟踪特定的内核事件或子系统。虽然就内核开发而言,跟踪是必须的,但遗憾的是,有些情况会影响内核的稳定性。这种情况可能需要off-target分析,这将在调试中解决。
Linux内核跟踪和性能分析
要闻:14年了:“千年老二”微软终于有机会扳倒谷歌搜索
热消息:微星推出Cubi 5 12M迷你主机:仅0.66L、配备双网口
世界热点评!女生应聘被问是否单身!当事公司:要求单身正常 将起诉举报者
【全球时快讯】近50年来首次!日本沙滩惊现大量沙丁鱼 原因未知:开排核废水、也要大地震?
最新资讯:国产车开门红:1月比亚迪称王 大众沦落第三 合资腰斩
03-Pandas详解
今日热讯:ChatGPT能做什么?零基础教你免费使用ChatGPT和账号注册
当前速看:美团面试失败后,翻了两年前的面试题,发现根本不是一个难度的
当前简讯:Linux安装
Spring Boot发送GET/POST请求——RestTemplate的基本使用
当前报道:自研指令集没有侵权MIPS 国产CPU龙芯赢了:摆脱官司
当前讯息:自燃车辆引燃邻车 损失谁来赔?法院释疑
天天最新:基于 eBPF 的 Serverless 多语言应用监控能力建设
世界最新:构建亿级别的消息推送基础模型
全球热文:Linux开源工具之nethogs命令介绍
精选!COBOL教程_编程入门自学教程_菜鸟教程-免费教程分享
华硕发布新款Vivobook 13 Slate笔记本:Intel 7W超低功耗U
今日精选:3岁女童喊脚疼被确诊癌症晚期:神经母细胞瘤 儿童癌症之王
天天微速讯:剧版《三体》弹幕互动量破2000万!豆瓣涨至8.3分
【热闻】iPhone 15 Ultra狂堆料!价格可能贵出天际
环球热议:全球不足50人!宝鸡发现1例罕见黄金血型:比熊猫血更稀有
环球资讯:ASP.Net Core 教程_编程入门自学教程_菜鸟教程-免费教程分享
ChatGPT保姆级注册教程
group by 、concat_ws()、 group_caoncat()的使用
全球热头条丨Jedis那么低性能,还在用吗? lettuce时代开幕啦
热资讯!阿里IM技术分享(十):深度揭密钉钉后端架构的单元化演进之路
强震已致超7700人遇难!土耳其地震背后的人祸 建筑不达标、豆腐渣工程多
全球热议:全球首架国产大飞机C919首飞三亚 民航最高接待礼“过水门”接风
环球关注:iPhone 15 Pro系列拿到三星顶级屏幕!超出S23系列整整两代
全球消息!高级Excel教程_编程入门自学教程_菜鸟教程-免费教程分享
重点聚焦!Serverless 时代开启,云计算进入业务创新主战场
【天天报资讯】Go的参数是传值还是传引用问题
【环球聚看点】【踩坑记录】单测中@PostConstruct多次执行
免费无广告 微软电脑管家2.7公测版发布:任务栏被意外修改有救了
4599元!佳能EOS R50发布:329克超轻便 支持无裁切6K
天天信息:研发10几年、花费千亿:日本国产大飞机为何失败?就是畸形产物
全球微速讯:LV将涨价?国人排长龙抢购 买万元包像在赶集:世界首富曾感慨中国用户有钱
高级Excel图表教程_编程入门自学教程_菜鸟教程-免费教程分享
Apache ANT 教程_编程入门自学教程_菜鸟教程-免费教程分享
焦点播报:算法学习笔记(15): Trie(字典树)
今日讯!火山引擎 DataTester“智能发布”:覆盖产品研发、测试、上线全流程,一站式智能管理 A/B 实验
DB2教程_编程入门自学教程_菜鸟教程-免费教程分享
马斯克将于3月1日公布特斯拉宏图第三篇章 第二篇章已烂尾
世界观速讯丨国产车企1:1复刻几十年前的MINI外观专利 宝马抗议!结果判了
【独家焦点】真心没想到!五旬男子开车撞上护栏:只因刚割了双眼皮
全球热消息:全世界最后一只袋狼究竟是怎么死的?
民企第一只 京东仓储REIT上市:认购额超718亿元遭疯抢
当前视讯!C#(进制转换) NumberConversion
ChatGPT国内也能用吗?ChatGPT国内镜像站点分享给你们
微动态丨暴躁小钢炮!极氪X实车亮相:零百加速3秒级
环球微速讯:《仙剑奇侠传》《和平精英》梦幻联动:赵灵儿端枪吃鸡
啥身材都能包!真维斯连帽卫衣大促:日常100元 现价50到手
6年来苹果iPhone涨价近50% 还会继续涨 库克不怕没人买
《流浪地球2》导演郭帆:国产科幻片工业流程还是初级 吃饭都会出大错误
童话二分之一的大结局是什么?童话二分之一演员表
金棕色适合什么肤色?金棕色和金栗色茶色的区别有哪些?
回避型人格障碍的表现有哪些?回避型人格障碍怎么治疗?
天天快资讯丨袋鼠云数栈UI5.0焕新升级,全新设计语言DT Design,更懂视觉更懂你!
【世界热闻】芯驿电子发布车载系列产品全新品牌AUMO
速讯:仿制作图《这里是中国》封面
【天天播资讯】spring注解
升学宴是什么意思?学生升学宴家长答谢宴致辞
货柜标准尺寸是多少?货柜集装箱尺寸规格表
淘宝换购是什么意思?淘宝换购的东西是正品吗?
笔记本键盘怎么拆卸?笔记本电脑键盘拆卸方法
ddr2内存条还能用吗?ddr2和ddr3的区别有哪些?
爱奇艺弹幕开关在哪里?爱奇艺怎么关闭弹幕?
手机微信语音电话接不到是什么原因?手机微信语音没有声音是怎么回事?
观点:零跑汽车创始人:有信心在一些环节超越特斯拉
【全球热闻】大六缸白菜价!马自达CX-90售价公布:约27.8万元起
美国计划强制让电动汽车“发声” 20多年的老车也不放过
环球热资讯!冷空气今起发货!江南等地暴雨北方局地暴雪 出行注意
人民日报评智能电视套路收费:广告无法消除、会员一充再充
必应、Edge拥抱ChatGPT 微软一晚大赚5400多亿:AI时代已到
焦点报道:女子网上买iPhone 14收到一堆铁片 京东自营退一赔一
天天日报丨用ChatGPT搞钱年入百万!各路博主发布生财之道 网友回呛
今日讯!比亚迪秦PLUS DM-i 2023冠军版宣布2月10日发布:车机、续航全升级
精选!特斯拉跌落神坛?辅助驾驶横评仅得第七
必知必会的设计原则——依赖倒置原则
难怪发质没有变好!这么多年用吹风机竟用错了
每日快看:PC 10年来最大跌幅 2023依然寒气逼人:复活要靠Win10“死亡”
全球通讯!优化渣?《霍格沃兹之遗》3A游戏被指太吃硬件:8GB显存都不好意思打招呼
坐拥千万粉丝医生称女子因洁牙感染梅毒?口腔机构回应 权威科普来了
读Java实战(第二版)笔记04_用流收集数据
世界今热点:告别OLED!苹果2025年商用microLED:克服烧屏问题
【世界时快讯】一加杀入平板领域!一加Pad发布:天玑9000加持
观点:女子存款5万需提供个人收入证明引热议:回应来了
一文了解WiFi 7优势:网速快不是最大看点
全球聚焦:男子网恋5年转给对方1700万被骗 还是已婚男人:网友崩溃
全球信息:Go学习资料
阿里云产品-智能语音交互快速测评
世界快讯:“ChatGPT中文版”上线:遭国内网友爆破
三十年了 钠离子电池总算熬出头!取代铅酸、把锂价打下去
环球热门:女子取药时发现医生用手机追剧引争议 医院回应:核实后会处罚
看完狗头萝莉、胡鑫宇的遭遇 我想聊聊自杀这件事
当前头条:亚洲第一!中国火箭发动机试车台传喜讯
【全球报资讯】【LeetCode哈希表#4】梦开始的地方:两数之和(map),以及关于容器map的一些代码技巧
【全球独家】18寸终极发烧游戏本!ROG枪神7 Plus超竞版评测:首发i9-13980HX多核暴涨40%
杭州法华寺月薪8万招聘和尚?传授72绝技?假的