游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Linux诊断调试利器strace命令详解

  strace是什么?
  按照strace官网的描述,strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。
  strace底层使用内核的ptrace特性来实现其功能。
  在运维人员的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。strace能做什么?
  运维工程师都是实践派的人,我们还是先来个例子吧。
  我们从别的机器copy了个叫做someserver的软件包过来,开发说直接启动就行,啥都不用改。可是尝试启动时却报错,根本起不来!
  启动命令:。someserver。。confsomeserver。conf
  输出:FATAL:InitLogFilefailediRet:1!Initerror:1655
  为什么起不来呢?从日志看,似乎是初始化日志文件失败,真相到底怎样呢?我们用strace来看看。stracettf。someserver。。confsomeserver。conf
  输出:
  我们注意到,在输出InitLogFilefailed错误的前一行,有个open系统调用:23:14:24。448034open(usrlocalappssomeserverlogserveragent。log,ORDWROCREATOAPPENDOLARGEFILE,0666)1ENOENT(Nosuchfileordirectory)
  它尝试打开文件usrlocalappssomeserverlogserveragent。log来写(不存在则创建),可是却出错了,返回码是1,系统错误号errorno为ENOENT。查下open系统调用的手册页:
  man2open
  搜索ENOENT这个错误号errno的解释
  ENOENTOCREATisnotsetandthenamedfiledoesnotexist。Or,adirectorycomponentinpathnamedoesnotexistorisadanglingsymboliclink。
  这里说得比较清楚,因为我们例子中的open选项指定了OCREAT选项,这里errno为ENOENT的原因是日志路径中某个部分不存在或者是一个失效的符号链接。我们来一级一级看下路径中的哪部分不存在:lslusrlocalappssomeserverlogls:cannotaccessusrlocalappssomeserverlog:Nosuchfileordirectorylslusrlocalappssomeservertotal8drwxrxrx2rootusers4096May1423:13bindrwxrxrx2rootusers4096May1422:48conf
  原来是log子目录不存在!上层目录都是存在的。手工创建log子目录后,服务就能正常启动了。
  回过头来,strace究竟能做什么呢?
  它能够打开应用进程的这个黑盒,通过系统调用的线索,告诉你进程大概在干嘛。strace怎么用?
  既然strace是用来跟踪用户空间进程的系统调用和信号的,在进入strace使用的主题之前,我们的先理解什么是系统调用。
  关于系统调用:
  按维基百科中的解释,在计算机中,系统调用(英语:systemcall),又称为系统呼叫,指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。
  系统调用提供用户程序与操作系统之间的接口。操作系统的进程空间分为用户空间和内核空间:操作系统内核直接运行在硬件上,提供设备管理、内存管理、任务调度等功能。用户空间通过API请求内核空间的服务来完成其功能内核提供给用户空间的这些API,就是系统调用。
  在Linux系统上,应用代码通过glibc库封装的函数,间接使用系统调用。
  Linux内核目前有300多个系统调用,详细的列表可以通过syscalls手册页查看。这些系统调用主要分为几类:文件和设备访问类比如openclosereadwritechmod等进程管理类forkcloneexecveexitgetpid等信号类signalsigactionkill等内存管理brkmmapmlock等进程间通信IPCshmgetsemget信号量,共享内存,消息队列等网络通信socketconnectsendtosendmsg等其他
  熟悉Linux系统调用系统编程,能够让我们在使用strace时得心应手。不过,对于运维的问题定位来说,知道strace这个工具,会查系统调用手册,就差不多够了。
  想要深入了解的同学,建议阅读《Linux系统编程》,《Unix环境高级编程》等书籍。
  我们回到strace的使用上来。strace有两种运行模式。
  一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可。比如我们要跟踪lslhvarlogmessages这个命令的执行,可以这样:stracelslhvarlogmessages
  另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。这种情况,给strace传递个ppid选项即可。
  比如,有个在运行的someserver服务,第一步,查看pid:pidofsomeserver17553
  得到其pid17553然后就可以用strace跟踪其执行:stracep17553
  完成跟踪时,按ctrlC结束strace即可。
  strace有一些选项可以调整其行为,我们这里介绍下其中几个比较常用的,然后通过示例讲解其实际应用效果。
  strace常用选项:
  从一个示例命令来看:stracettTvfetracefileodatalogstrace。logs1024p23489
  tt在每行输出的前面,显示毫秒级别的时间
  T显示每次系统调用所花费的时间
  v对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
  f跟踪目标进程,以及目标进程创建的所有子进程
  e控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
  o把strace的输出单独写到指定的文件
  s当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
  p指定要跟踪的进程pid,要同时跟踪多个pid,重复多次p选项即可。
  实例:跟踪nginx,看其启动时都访问了哪些文件stracettTfetracefileodatalogstrace。logs1024。nginx
  部分输出:
  输出中,第一列显示的是进程的pid,接着是毫秒级别的时间,这个是tt选项的效果。
  每一行的最后一列,显示了该调用所花的时间,是T选项的结果。
  这里的输出只显示和文件访问有关的内容,这是因为我们通过etracefile选项指定了。strace问题定位案例
  1、定位进程异常退出
  问题:机器上有个叫做run。sh的常驻脚本,运行一分钟后会死掉。需要查出死因。
  定位:进程还在运行时,通过ps命令获取其pid,假设我们得到的pid是24298straceostrace。logttp24298
  查看strace。log,我们在最后2行看到如下内容:22:47:42。803937wait4(1,unfinished。。。22:47:43。228422killedbySIGKILL
  这里可以看出,进程是被其他进程用KILL信号杀死的。
  实际上,通过分析,我们发现机器上别的服务有个监控脚本,它监控一个也叫做run。sh的进程,当发现run。sh进程数大于2时,就会把它杀死重启。结果导致我们这个run。sh脚本被误杀。
  进程被杀退出时,strace会输出killedbySIGX(SIGX代表发送给进程的信号)等,那么,进程自己退出时会输出什么呢?
  这里有个叫做testexit的程序,其代码如下:includestdio。hincludestdlib。hintmain(intargc,charargv){exit(1);}
  我们strace看下它退出时strace上能看到什么痕迹。stracettetraceprocessf。testexit
  说明:etraceprocess表示只跟踪和进程管理相关的系统调用。
  输出:23:07:24。672849execve(。testexit,〔。testexit〕,〔35vars〕)023:07:24。674665archprctl(ARCHSETFS,0x7f1c0eca7740)023:07:24。675108exitgroup(1)?23:07:24。675259exitedwith1
  可以看出,进程自己退出时(调用exit函数,或者从main函数返回),最终调用的是exitgroup系统调用,并且strace会输出exitedwithX(X为退出码)。
  可能有人会疑惑,代码里面明明调用的是exit,怎么显示为exitgroup?
  这是因为这里的exit函数不是系统调用,而是glibc库提供的一个函数,exit函数的调用最终会转化为exitgroup系统调用,它会退出当前进程的所有线程。实际上,有一个叫做exit()的系统调用(注意exit前面的下划线),线程退出时最终会调用它。
  2、定位共享内存异常
  有个服务启动时报错:shmget26726430097568:InvalidargumentCannotgetshm。。。exit!
  错误日志大概告诉我们是获取共享内存出错,通过strace看下:stracettfetraceipc。amonsvr。。confamonsvr。conf
  输出:22:46:36。351798shmget(0x5feb,12000,0666)022:46:36。351939shmat(0,0,0)?Process21406attached22:46:36。355439shmget(0x41400,30097568,0666)1EINVAL(Invalidargument)shmget26726430097568:InvalidargumentCannotgetshm。。。exit!
  这里,我们通过etraceipc选项,让strace只跟踪和进程通信相关的系统调用。
  从strace输出,我们知道是shmget系统调用出错了,errno是EINVAL。同样,查询下shmget手册页,搜索EINVAL的错误码的说明:
  EINVALAnewsegmentwastobecreatedandsizeSHMMINorsizeSHMMAX,ornonewsegmentwastobecreated,asegmentwithgivenkeyexisted,butsizeisgreaterthanthesizeofthatsegment
  翻译下,shmget设置EINVAL错误码的原因为下列之一:要创建的共享内存段比SHMMIN小(一般是1个字节)要创建的共享内存段比SHMMAX大(内核参数kernel。shmmax配置)指定key的共享内存段已存在,其大小和调用shmget时传递的值不同。
  从strace输出看,我们要连的共享内存key0x41400,指定的大小是30097568字节,明显与第1、2种情况不匹配。那只剩下第三种情况。使用ipcs看下是否真的是大小不匹配:ipcsmgrep41400keyshmidownerpermsbytesnattchstatus0x000414001015822root666300955161
  可以看到,已经0x41400这个key已经存在,并且其大小为30095516字节,和我们调用参数中的30097568不匹配,于是产生了这个错误。
  在我们这个案例里面,导致共享内存大小不一致的原因,是一组程序中,其中一个编译为32位,另外一个编译为64位,代码里面使用了long这个变长int数据类型。
  把两个程序都编译为64解决了这个问题。
  这里特别说下strace的etrace选项。
  要跟踪某个具体的系统调用,etracexxx即可。但有时候我们要跟踪一类系统调用,比如所有和文件名有关的调用、所有和内存分配有关的调用。
  如果人工输入每一个具体的系统调用名称,可能容易遗漏。于是strace提供了几类常用的系统调用组合名字。
  etracefile跟踪和文件访问相关的调用(参数中有文件名)
  etraceprocess和进程管理相关的调用,比如forkexecexitgroup
  etracenetwork和网络通信相关的调用,比如socketsendtoconnect
  etracesignal信号发送和处理相关,比如killsigaction
  etracedesc和文件描述符相关,比如writereadselectepoll等
  etraceipc进程见同学相关,比如shmget等
  绝大多数情况,我们使用上面的组合名字就够了。实在需要跟踪具体的系统调用时,可能需要注意C库实现的差异。
  比如我们知道创建进程使用的是fork系统调用,但在glibc里面,fork的调用实际上映射到了更底层的clone系统调用。使用strace时,得指定etraceclone,指定etracefork什么也匹配不上。
  3、性能分析
  假如有个需求,统计Linux4。5。4版本内核中的代码行数(包含汇编和C代码)。这里提供两个Shell脚本实现:
  poorscript。sh:
  !binbash
  totalline0
  whilereadfilename;do
  line(wclfilenameawk‘{print1}’)
  ((totallineline))
  done(findlinux4。5。4typef(iname‘。c’oiname‘。h’oiname‘。S’))
  echototalline:totalline
  goodscript。sh:
  !binbash
  findlinux4。5。4typef(iname‘。c’oiname‘。h’oiname‘。S’)print0
  wclfiles0fromtailn1
  两段代码实现的目的是一样的。我们通过strace的c选项来分别统计两种版本的系统调用情况和其所花的时间(使用f同时统计子进程的情况)
  从两个输出可以看出,goodscript。sh只需要2秒就可以得到结果:19613114行。它大部分的调用(calls)开销是文件操作(readopenwriteclose)等,统计代码行数本来就是干这些事情。
  而poorscript。sh完成同样的任务则花了539秒。它大部分的调用开销都在进程和内存管理上(wait4mmapgetpid)。
  实际上,从两个图中clone系统调用的次数,我们可以看出goodscript。sh只需要启动3个进程,而poorscript。sh完成整个任务居然启动了126335个进程!
  而进程创建和销毁的代价是相当高的,性能不差才怪。总结
  当发现进程或服务异常时,我们可以通过strace来跟踪其系统调用,看看它在干啥,进而找到异常的原因。熟悉常用系统调用,能够更好地理解和使用strace。
  当然,万能的strace也不是真正的万能。当目标进程卡死在用户态时,strace就没有输出了。
  这个时候我们需要其他的跟踪手段,比如gdbperfSystemTap等。
  备注:
  1、perf原因kernel支持
  2、ftracekernel支持可编程
  3、systemtap功能强大,RedHat系统支持,对用户态,内核态逻辑都能探查,使用范围更广
  本文永久更新链接地址:http:www。linuxidc。comLinux201801150654。htm
  原文链接:http:blog。51cto。com105415561793898
  strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
  strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。当然strace与专业的调试工具比如说gdb之类的是没法相比的,因为它不是一个专业的调试器。strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后它也就退出了。在命令执行的过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所接收到的所有的信号值。rootubuntu:usrstracecatdevexecve(,〔,〕,〔〕)brk()access(,FOK)ENOENT(Nosuchfileordirectory)mmap(NULL,,PROTREADPROTWRITE,MAPPRIVATEMAPANONYMOUS,,)access(,ROK)ENOENT(Nosuchfileordirectory)。。。brk()brk()fstat(,{stmodeSIFCHR,strdevmakedev(,),。。。})open(,ORDONLY)fstat(,{stmodeSIFCHR,strdevmakedev(,),。。。})read(,,)close()close()close()exitgroup()?
  每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
  strace显示这些调用的参数并返回符号形式的值。strace从内核接收信息,而且不需要以任何特殊的方式来构建内核。
  strace参数c统计每一系统调用的所执行的时间,次数和出错的次数等。d输出strace关于标准错误的调试信息。f跟踪由fork调用所产生的子进程。ff如果提供ofilename,则所有进程的跟踪结果输出到相应的filename。pid中,pid是各进程的进程号。F尝试跟踪vfork调用。在f时,vfork不被跟踪。h输出简要的帮助信息。i输出系统调用的入口指针。q禁止输出关于脱离的消息。r打印出相对时间关于,,每一个系统调用。t在输出中的每一行前加上时间信息。tt在输出中的每一行前加上时间信息,微秒级。ttt微秒级输出,以秒了表示时间。T显示每一调用所耗的时间。v输出所有的系统调用。一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出。V输出strace的版本信息。x以十六进制形式输出非标准字符串xx所有字符串以十六进制形式输出。acolumn设置返回值的输出位置。默认为40。eexpr指定一个表达式,用来控制如何跟踪。格式如下:〔qualifier〕〔!〕value1〔,value2〕。。。qualifier只能是trace,abbrev,verbose,raw,signal,read,write其中之一。value是用来限定的符号或数字。默认的qualifier是trace。感叹号是否定符号。例如:eopen等价于etraceopen,表示只跟踪open调用。而etrace!open表示跟踪除了open以外的其他调用。有两个特殊的符号all和none。注意有些shell使用!来执行历史记录里的命令,所以要使用。etrace只跟踪指定的系统调用。例如:etraceopen,close,rean,write表示只跟踪这四个系统调用。默认的为setall。etracefile只跟踪有关文件操作的系统调用。etraceprocess只跟踪有关进程控制的系统调用。etracenetwork跟踪与网络有关的所有系统调用。estracesignal跟踪所有与系统信号有关的系统调用etraceipc跟踪所有与进程通讯有关的系统调用eabbrev设定strace输出的系统调用的结果集。v等与abbrevnone。默认为abbrevall。eraw将指定的系统调用的参数以十六进制显示。esignal指定跟踪的系统信号。默认为all。如signal!SIGIO(或者signal!io),表示不跟踪SIGIO信号。eread输出从指定文件中读出的数据。例如:eread,ewrite输出写入到指定文件中的数据。ofilename将strace的输出写入文件filenameppid跟踪指定的进程pid。sstrsize指定输出的字符串的最大长度。默认为32。文件名一直全部输出。uusername以username的UID和GID执行被跟踪的命令
  通用的完整用法:straceooutput。txtTttetraceallp28979
  上面的含义是跟踪28979进程的所有系统调用(etraceall),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output。txt文件里面。
  语法
  strace〔dffhiqrtttTvxx〕〔acolumn〕〔eexpr〕。。。〔ofile〕〔ppid〕。。。〔sstrsize〕〔uusername〕〔Evarval〕。。。〔Evar〕。。。〔command〔arg。。。〕〕
  stracec〔eexpr〕。。。〔Ooverhead〕〔Ssortby〕〔command〔arg。。。〕〕
  追踪系统调用
  现在我们做一个很简单的程序来演示strace的基本用法。这个程序的C语言代码如下:includestdio。hintmain(){inta0;printf(pleaseinput:);scanf(d,a);printf(9d,a);return0;}
  从trace结构可以看到,系统首先调用execve开始一个新的进行,接着进行些环境的初始化操作,最后停顿在read(0,上面,这也就是执行到了我们的scanf函数,等待我们输入数字呢,在输入完99之后,在调用write函数将格式化后的数值2输出到屏幕,最后调用exitgroup退出进行,完成整个程序的执行过程。
  跟踪信号传递
  我们还是使用上面的那个test程序,来观察进程接收信号的情况。
  系统调用统计
  strace不光能追踪系统调用,通过使用参数c,它还能将进程所有的系统调用做一个统计分析给你,下面就来看看strace的统计,这次我们执行带c参数的strace:
  这里很清楚的告诉你调用了那些系统函数,调用次数多少,消耗了多少时间等等这些信息,这个对我们分析一个程序来说是非常有用的。
  原文地址:https:www。cnblogs。commachangwei8p10388883。html

他7岁入党,9岁参加长征,舅舅是贺龙元帅,如今96岁了,身体引言在我党早期革命斗争史上,有很多英雄人物为了祖国和民众,不惜献出生命,但也有很多人意志不坚定,面对敌人的威逼利诱,选择叛敌投降,还带着敌人破坏我党基层组织,残害我党进步……近阶段我国为何急切的加大税务整顿力度?关于税收这个命题其实蛮复杂的,有关其重要性,教员曾有一句很形象的话:手中没有米,叫鸡都不来!中国历史上的一些重要变法,其核心之一就是进行税收变革,通过现有社会财富的重新分配,有……为什么说南明弘光政权是有希望翻盘的?翻盘不好说,但是就形势而论,弘光朝只能说有重现南宋的基础。当然都到了弘光朝了,之前的帝位争端就当他已经都发生了,朝堂的分裂也已一半人被赶走落下帷幕。优势就是终于脱手了北方……志愿军首战大捷后,毛主席再用一妙计诱敌,成功缔造美军最大噩梦这是美军入朝作战以来的第一场噩梦之战,1950年10月,伴随着喀秋莎火箭炮的猛攻,志愿军入朝首战打响。短短10天时间,15000多名敌军化为炮灰。然而,在入朝首战大捷之后……他对解放西藏贡献巨大,后来主政宁夏多年,官至副国级,子女很牛中国是一个非常强大,而且独立的国家。有很多人都好奇,中国这样一个庞大的组织是如何在疫情期间这样有秩序有规律的生活呢?我们都知道其实人是一个非常不喜欢被管制的这样的一个个体,在生……41逆转,闪击6分钟2球超级乌龙助攻,亚洲第3力压中国队登顶女足东亚杯第二轮率先展开一场激战,由亚洲排名第3的日本队PK亚洲排名第7的中国台北队。日本女足大家都比较熟悉,他们是世界杯冠军,还曾两次夺得亚洲杯的冠军,而中国台北要逊色……历朝历代名将之轶事典故集锦中国文化博大精深,历朝历代名将的成语轶事典故,脍炙人口。上自夏商周,下至元明清,荟萃如下。1。姜尚大器晚成(周朝)2。先轸兵行诡道(春秋)3。荀息假途伐虢(春……玉米面不要熬粥了,教你创意好吃做法,香甜松软,出锅孩子抢着吃大家好,我是慧慧把一碗玉米面用开水烫一下,没想到这么好吃,口感细腻,天天吃得不腻,下面来看一下我是怎么做的吧。首先往盆里倒入100克的玉米面倒入100毫升的开水烫一……夜读80后,站在而立不惑间沐浴着新年的阳光,翻开新的台历,不知不觉间,我们这些前80后不少人已迈入不惑之年。岁月这把杀猪刀,正将淡淡的鱼尾纹刻在80后的眼角眉梢。80后这一代是特别的,因为他们出生……他30岁时抽日军耳光,在河北跳崖而未牺牲,后成为河北省军区司纵谈古今,深挖您所不知道的河北历史,大家好,我是青史君,欢迎关注青史观,每天为您带来新鲜、有趣、干货满满的历史故事。今天,我们为您聊的是江西籍开国中将王道邦的故事。……革命女英雄曾宪植,18岁嫁给叶剑英,丈夫另娶后她选择孤独终老说起中国近代史上赫赫有名的人物,曾国藩是不能跨过的一个人。他的德行品质是那个时代的典范,很多人慕名拜访学习。他身上的品格作为家风流传下来,对于曾氏家族的成员有很深远……新疆悍匪乌斯满的覆灭之路前言:一九五零年四月,新疆发生了一件震惊全国的大事,解放军的市级干部罗少伟在出差途中遭到土匪乌斯满突袭,不幸牺牲,年仅三十二岁。主席得知噩耗,半晌说不出话。周总理感叹我军又在匪……
萧子升曾是毛泽东知己,建党前与毛争吵后分手,后飘摇海外40载你去穿你的长袍马褂去吧!你做你的绅士,我走我的独木桥青年毛泽东和挚友萧子升的诀别之语。1921年3月,在法国留学一年有余的湖南名士萧子升回到了中国,他是因筹备中法(法国)……1968年一土匪刑满回家,举报72岁老农他害死我党5名高级干1968年年底的一天,华北平原上被一层薄薄的白雪覆盖着,彼时的新中国已经成立二十年左右了,尽管是山区,但华北平原上还是展现出一片朝气蓬勃的样子。这天,齐达榜从遥远的东北地……人生若只如初见人生的旅途漫长而波折,我们谁也无法预知未来是怎么样的,所以都一切机遇充满了希望。在慢慢年华里,寻找那个能并肩前行的人。或许在街角不经意的回眸,是雨天匆忙地擦肩而过。而有的人注定……1956年,因为3000美元贷款,蒋介石逼死杜聿明长子?1956年,美国。这一天中午,杜聿明的长女杜致礼像往常一样叫弟弟杜致仁吃饭。可是弟弟的房门紧闭,怎么叫也不开门。情急之下,杜致礼只好让人破门而入。进门之后,看见年轻……答应我,女人敷面膜时,牢记这3要3不要,否则敷了等于白敷对于绝大多数的女性而言,日常护肤已经成为了必不可少的一门课题,而这其中非常关键的一步就是敷面膜进行补水或者是皮肤的修护美白,但是你知道敷面膜也有它一定的法则吗?对于一些法则,如……现在发达的交通网络,离不开当年毛主席的大手笔,确实高瞻远瞩所谓要想富,先修路,铁路一响,黄金万两,经济要想发展,就离不开交通之力。今天的中国,公路、铁路等交通网络已经遍布全国,给经济发展提供了极大的便利,其实,这离不开毛主席在建……新外援已到位,国安启用全新锋线搭档,24岁攻击手被弃后卫上位新外援已到位,国安启用全新锋线搭档,24岁攻击手被弃用后卫上位中超联赛本赛季最惨的球队无疑是北京国安,在联赛当中奥古斯托、金玟哉、比埃拉等外援全部留队。在第一阶段最后一场……发在朋友圈会被秒赞的文案1人生苦短,再来一碗2春来无事,只为花忙。3不笑运气差,一笑脸就大4我等过你的,是你来晚了5生活不过,三两茶饭事。6所有的最好,都不如刚好7……越南2022年GDP4090亿美元人均GDP4110美元,能先来看结果,越南2022年实现了8的高增长,上图因为国家统计局第四季度的数据还没有公布。那我们就比较下2021年的GDP数据,看越南的GDP在2021年GDP数据中能排在……函数式编程的思维转变从数据参数化到行为参数化为什么要了解函数式编程;函数式编程对哪些设计模式产生了影响;如何从数据参数化过渡到行为参数化;策略模式的三种实现方式。极客架构师专注架构师成长。大家好,我是码农老吴……钱学森回国给元帅讲课,参加国宴没找到座位,主席名字我划掉了1949年10月1日,开国大典上,当主席向全世界宣传新中国成立的消息,中国人民终于盼来这一伟大时刻,也随之进入一个新的时代。建国初期,随着剿匪战争的结束,以及西部各省的相……世界强国冈比亚扬言踏平苏联干掉美国,号称7天攻占中国?翻开地图,拿起放大镜仔细地寻找,你会发现一个被三面塞内加尔包围、形状像大肠一样的国家。这个国家就是被中国网友们称为宇宙神国的冈比亚。冈比亚共和国,简称冈比亚,位于非洲西部大西洋……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网