这王老师出了两道竞赛题题怎么做

这两道题怎么做_高等数学吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:207,512贴子:
这两道题怎么做收藏
这两道题怎么做
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或这两道题怎么做谢谢了_百度知道腾讯实习生面试,这两道题目该怎么回答?
谢谢大神们高质量的回答,满满干货,excited-----------------------------------------------------------------回答里有提到保密协议,实习生面试前没有听说这个,并且网上也有很多相关的面经,但为了省去一些不必要的问题,匿了。------------------------------------------------------------------------在参加腾讯2016实习生招聘面试时,有两道问题自己没有想清楚也思考的不是很明白,面试结束时后悔没有问面试官正解是什么,回来后在搜索引擎上也没有搜到相关的问题。1. 第一道题目:在多线程和大量并发环境下,如果有一个平均运行一百万次出现一次的bug, 你如何调试这个bug。
题主对于这种比较大的工程没有接触过所以没有这方面的经验,我回答的是:首先要试图重现这个bug,在重现bug时,需要保留当时的一些状态信息,然后进行调试,依次确定与这个bug有关的模块(加桩和驱动)。听到我的回答后,面试官说这个bug很难重现,这个时候你要怎么处理或者重现呢。 我回答说:那么这个bug出现的概率比较小,如果没有造成太大的影响能不能忽略。 然后面试官说那10W次出现一次呢, 之后我就没有了想法。2. 第二道题目的题意我不理解,题目是面试官给我的试卷上面的。题目描述:有一个类指针,指向类实例化的对象,在这个对象程序的运行过程中,程序崩溃了,后来发现是这个类指针的虚函数表被破坏了,现在如何定位这个问题。我把"如何定位这个问题"理解的是如何定位这个bug所在,然后我回答:知道虚函数表被破坏了,那么问题不是在这里吗,可以依次确定是不是调用了应该调用的虚函数。然后面试官说虚函数表里面的内容没有问题,之后我有点蒙了,我回答说那是不是指向虚函数表的指针被破坏了。面试官说你可能没有理解题意,所以我比较郁闷,是不是还有另外的原因。所以,我想问下知乎大神这两道题目该怎么回答, 第二道题目的题意该怎么理解。谢谢谢谢大家!!!!
按时间排序
101 个回答
可能是他已经选中想要的人了,其实你回答什么并不重要。我的第一个问题是linux内核在i/o做过哪些改进来改良它的效率。我就知道我跪了,二面看缘分吧
这种工程性的东西,拿出来当问题,然后说别人c++基础差,我觉得考察的方式有些问题
竟然没有实际案例!
面试如同相亲,是个双向选择的过程。毫无疑问,面试官一方失败了。
腾讯问一个问题就够了:你对盗版和山寨有什么看法?
说实话,第二题没看懂。我也认为只可能是虚函数表指针,或者是表本身被破坏。。。。看了其他大神们的回复,也都是这两种啊。面试官先说不是表本身被修改。然后你就问了一下那是指针被改了?对方就直接说你不懂,就给挂了。orz.....(如果你明白还有其他可能破坏虚函数表,麻烦你也告诉我一下。)另外,第一题bug不好重现:一般是根据现有情报先分析,确定大致bug的范围;接着只能多打log,尽量做dump。多开几个程序跑,把bug跑出来。如果一个bug只出现一次,神都调试不出来。。写log上有很多需要注意的。整个流程中的最先输入一定要log。按照流程划分再次log。如果只是线上才出现的bug,说不定跟输入有关系。私以为自己线下模拟高并发并不一定能重现,如果实在是时间充裕可以试一试。另外,如果log下来的引发bug的输入保存好了,可以用自己保存的数据来测试代码,说不定偶发bug就变成必然发生的情况了。如果发生概率提升了,基本就好调试很多。至于code review都是技术之外的手段了。如果发现bug有某种重复性出现的规律,可以自己写条件语句log,还有数据断点都可以使用,包括直接dump堆栈。会好调试很多。
第一个问题 的回答已经很详实了,另外补充如果bug一定在第100w或者10w次前后的时机出现,那么可以考虑的方向:小块资源泄漏、计数器溢出第二个问题,如果虚函数表被破坏了,可能会比较简单,可以尝试用mprotect把虚函数表的区域设置为只读来排查问题;如果虚函数表完好,那么基本就是虚表指针的问题,可能有几种原因:已经析构或正在析构的对象被其他线程调用,多继承体系中非法的cast,对象内存被越界写。越界写就比难查了,也可以配合mprotect(参考这篇文章),或者在那些怀疑的class或struct增加magic number字段标记,看看能否通过被越界写的内容特征来找出真凶。
确实你c++基础太差了,不过这问题问应届毕业生有点过分了。第一个问题,首先你得定性问题的类型,100万是一个虚数,10万还是1万都无所谓。只是想告诉你这不是一个必然触发的bug,既然在多线程环境里,不是必然触发的问题,那必然是并发问题了。我想这是面试官想听到的第一个关键字。既然是并发问题,那把问题找出来的手段就太多了,不过既然是面试,我想面试官绝对不想听你说用某某工具就摆平问题的答案,考验你基础知识的时候到了,如果你围绕并发的本质和怎么提高并发bug的重现概率来讨论,并来一段静态代码分析的经验之谈,那应该能更好的展示自己。涉及你大学的知识包括了计算机语言和操作系统第二个问题,这是一个典型的宕机现场分析的案例。题目的所有描述,都是客观的在说明当前发生的事情,也就是看得到的现象,而对于宕机现场的分析,并不是说我把宕机的原因说清楚就ok了。要知道在实际的工作场景中,最终的目的是改掉bug,不宕机。所以我们看到问题后,有两个步骤是必须要做的:分析引起问题的原因,提出修改问题的解决方案。而面试官给你出的问题,是第一个步骤,需要你去分析什么原因引起问题的,所谓的定位问题,并不是定位问题的现象,而是定位代码中哪一行代码引起的问题。我们看到的宕机现象是虚表被破坏,但明显的一个陷阱是他并没有说其他数据的完整性,所以当你分析这个问题的时候,必须把多种情况都说全,作为面试官才可能给你一个满分。如果单单只是虚表被破坏,而虚表后面的数据有一部分是完好的,被修改的只是靠前的部分,那应该是内存越界导致的问题,而你又要根据是堆还是栈上分配的空间来定位可能越界的操作来自于哪一段内存中的数据,根据这个数据追溯到内存越界的案发现场,也就是出问题的代码。如果数据完全被破坏,并且呈现000之类的连续重复字符,那应该考虑是否在哪出做了memset之类的操作。如果完全破坏,并呈现混乱数据,那应该是某个野指针的访问,这个查起来就比较复杂了,需要大量的代码静态分析的经验。这题目主要涉及到你大学知识中的计算机语言、数据结构、操作系统和编译原理。其实我觉得面试官出的题目的难度略高了,不过作为一个优秀的大学毕业生而言,60分的回答应该不成问题的,而题主的回答很可惜的没有得分。不过不要灰心,你才大三,还有一年的时间可以好好努力的补足基础知识,你别看大学中学习的那些课程意义不大,但在实际的工作中,它们是你真正能依赖的本钱。努力攒把。
其实这两个问题拿来问有一定经验的中高级程序员是可以的,问应届的实习毕业生,就确实有点强人所难了。因为这些都是假设性问题,所以一般都只能说排查问题的思路:问题一:1:其实100万分之一的几率并不算很低。一个繁忙一点的服务,每秒一万个请求是很正常的(如果业务简单,还能更高)。所以百万分之一的复现概率,相当于在压力测试下几分钟就能出一次了。所以在道理上,如果有服务以这个几率出现bug,让它上线本身就是测试部门的失职。2:反过来说,既然几分钟就能复现,那就在测试环境里压就好了,想怎么改就怎么改,想怎么打log就怎么打log。3:假定测试环境的压测真的没出来,真的线上出现这样的问题(例如说压测的用例没有覆盖到)。首先考虑的是回滚服务到旧版,以确保正常业务不出问题。然后在线上环境提取某台机,用类似tcpcopy这样的软件导一份数据到测试环境中,来测试这个有问题的版本。这时候,既然是测试环境,你想怎么办都行(不影响线上服务)。4:到了真正去分析bug了,那首先确定bug的类型。例如说如果能core dump的话相对好办一些,因为可以从core dump大概能看出或者猜出一些东西来。而如果并不core dump,而只是导致数据错乱的话,那就要做数据出入口的校验等。5:在各顶级模块的入口出口打log,定位发生bug时所在的模块,然后逐步收敛。6:确定这些模块以及关联影响的模块,单独提取这些模块出来,进行测试或者code review,最终确定问题。问题二:1:这类bug,一般都涉及越界操作。2:一般这类bug,大多数都是可以通过静态code review解决的。既然知道是那个类,盯着用到这些类的实例的地方就行(包括这些类实例的前后几个对象,因为有可能是它们越界)。3:一些工具,例如valgrind、purify之类的,也有可能有帮助(不一定肯定有用,但一般还是挺有用的)。
第一个问题,100万次并发能出现,如果出现时有coredump文件,那可以通过这个结合现象和日志信息(如果他说没有日志,你可以直接走了)解决,如果没有coredump只有日志,那就分析日志定位到具体的模块和代码,走读代码,特别是锁相关的,分析有什么问题。第二个问题,他的意思应该是对象指向虚表的指针坏了,虚表本身肯定没问题,不然早就段错误了。所以考虑是踩内存了,如果是越界问题,用一些工具辅助检测,很好定位。如果不允许用工具,那同样,首先定位出问题的对象,走读代码看哪些地方有调用,或者间接调用。如果太灵异,每次出问题的地方都不定,这种问题很难解,没什么有效的办法。可以从代码扫描,编译warming全开的角度去发现可能的原因。
我感觉第一个问题的关键在于怎么重现和定位这个bug,加上原话里有“面试官说这个bug很难重现”,而且100万是一个泛泛的数字,后来又说那10万次呢,其潜台词就是,一个很大的数,但是这个概率你不能忽略,那么就可以判断,这1百万次重现的并发不能通过常规的运行模式来捕捉,需要人为的调整设定出bug的相关线程的并发频率。象有些回答里说的常规的加压也许肯能达到要求,但是我觉得这是系统测试工程师的做事方式,对于开发者,应该可以做的更加有技术含量,所以我认为这个题目的本意还是想考你怎么通过已有信息缩小范围,再有针对性的人对这个范围内的任务“加压”,比如通过修改参数,通过调整最大最小阀值,模拟一个极端的测试环境,如果怀疑是溢出,就开始查malloc之类的内存区域,可以大幅度调大和缩小这些值,看看bug是不是出现的更快和更慢,甚至做一个仿真测试,都有助于快速的定位这个bug。
第一个问题,在测试环境发压收dump,你问发多大的压?那得看你有多想解决这个bug了╭∩╮(︶︿︶)╭∩╮
我来跑个题。说到虚表。。有一次我定位一个LLVM miscompile,现象是崩溃。发现是虚函数调用时函数指针地址奇怪。然后当然是虚表指针错了。然后gdb watch虚表指针的地址看看哪个小贱人改了虚表指针,然后发现不知道哪个a[i]++中i正好越界,把虚表指针自增了1(其实看看虚表指针没对齐就该猜到了)。为啥会越界呢,源代码看着没问题,只是在双重循环里。emit IR一看,妈蛋给vectorize错了。然后去读vectorizer的代码,读到最后:*。自那以后看到指针第一件事是看对不对齐。------------------------- 跑题结束,继续跑题 -------------------------这东西怎么训练。。不好训练。有太多的东西,都是“人活得久一点,自然就身经百战见得多啦”。你可能说一个实习生怎么可能那么老,对,这个我兹瓷你,考察实习生这些“经验”而不是“技能”我觉得确实不妥,但是我觉得不妥又有什么用,别人照考不误。那只能设法让自己身经百战了/w\。不要按知识点去一个个死抠,be a &del&man&/del& hacker(大雾)。对于C++岗位来说,把汇编弄弄明白;修修GCC或者LLVM的bug;参加参加GSoC。到时候随便飘点calling convention,vectorization,devirtualization,LTO,搞好气场震慑欺软怕硬的傻逼很重要。虚表更是不在话下,你可以反问面试官“你看你对虚表这么热情啊,你知不知道multiple inheritance虚表怎么实现的?static_cast此种情况又是怎么实现的?virtual inheritance又是怎么实现的?知道multiple dispatch么?怎么在C++里用模拟实现unbounded multiple dispatch或者bounded multiple dispatch(std::experimental::variant&&::visit)?不知道不要紧,我给您讲讲”。其实这些虚表实现细节只要老实巴交地读点wiki page就行了。
第一题没经验,不清楚。不乱说了。说下第二题。这个bug是c++里很容易出现的一个bug,可能是写内存时越界了,破坏了虚函数表。这种问题难在难以定位,是哪里写内存写错了,因为写完后是看不出来错误的,只有在其它地方用到这块内存的时候,才会暴露出这个bug。所以很难调试解决,即便是编码经验十年的程序员,解决这类问题也要花不少时间排查。因为这个bug是一个经典且很有难度的问题,实际项目出现的概率不小,但是你并没有遇到过,因此面试官断言你编码的实际经验太少。
两个题都是忽悠人的无意义的 主要考察面试者忽悠人的能力
个人觉得:1. 最好有容错机制+log定位问题。如果非想要完美解决,检测到下次发生的时候把内存和调用栈dump出来。然后回来慢慢看。(具体做法嘛,如果内存足够多,一个简单的搞法是fork进程然后abort掉生成coredump。哇哈哈就是这么暴力,因为代码调api来生成dump的话太耗cpu怕影响正常业务)2. 这种情况无非是内存写越界或者不正确的类型转换导致的内存写坏。一种最常见的原因是对有虚函数的对象memset,但是内存写坏的原因太复杂,可能性太多了得具体情况具体分析。如果有重现方法,一种比较简单的做法是直接内存watch虚表指针的内存变化。那么写坏的那一刻,什么都知道了补充:刚刚想到问题2,如果是内存写越界,很有可能不止写坏了一个虚表指针。如果这样的话可以debug模式编译然后valgrind+memcheck很容易找到出问题的调用栈。(当然这只是碰运气哒,也许能比较快一点找到问题)前面有回答说mprotect,其实个人觉得这样不太好,因为mprotect会导致内存map的地址段被切割。然后这个地址段是有数量限制的,如果对象数量多的话容易出事儿。
并发和百万次有什么关系,言必称大数据,高并发,这是病。什么叫虚函数表破坏了,怎么得出来的结论,记得不久前说过一次defect fix,是出现了不对的行为,最后定位到虚函数表破坏了,这都是很难定位的问题,实习生问这些是出于什么考虑的呢?
1.多线程的bug。。。还是老老实实打log吧。。。我之前也是通过打log才找到多线程的bug的,不过情景没问题里面那么严峻。2.看看这个帖子里面的测试用例,有教你打印虚函数表出来,虽然我没完全弄懂面试官究竟要问的啥。感觉这类问题面试官主要是想和你多多伸展主题,和你深入交流的。只是回答会与否那是不怎么好的。
第一个是不是让你从多线程并发处找问题,第二个取虚函数表地址行不?我是小白,就是问问。
问题一:堆栈 log问题二:没看明白...
已有帐号?
无法登录?
社交帐号登录求这两道数学题怎么做&
ilKE84RX11
为您推荐:
其他类似问题
扫描下载二维码这两道题怎么做_百度知道

我要回帖

更多关于 二十四孝图两道题 的文章

 

随机推荐