㈠ 程序员遇到解决不了的bug怎么办
但大部分程序员都有一个问题就是不太愿意测试自己的代码。他们草草的调式完成以后就认为工作结束,测试那是测试人员的工作。
1. 影响了程序员自己的声誉
2. 影响了产品的质量
3. 影响了客户的信任度
4. 这个时候再 DEBUG 难度增大了许多。
大的不说,就说多自己声誉的影响吧。如果你的程序总会有这样那样的 BUG ,你得到收益会减少,即使你写了很多代码。
程序员必须克服一些自身的致命缺点才能够从根本上解决这个问题。那么这个问题是什么?前面我们已经提到,程序员对自己的代码都非常宽容,认为那是正确的没有问题。实际上这种想法比较正常,程序是通过程序员思考和设计之后才写出来,程序员不会将自己认为不正确的东西写到代码里,而到这个时候都一直假设程序是正确的;但人非圣贤,怎么可能不犯错误来。实际上程序员在对待其他程序员时候的态度就很好,带着一种挑剔和学习的态度;但一旦对待自己的代码就很难这么做;这就是最致命的。程序员也必须对自己的代码带着挑剔和学习的态度;这个基础是假设自己的代码是错误的,然后需要做的是怎么样证明自己的代码是正确的。程序员自身可以在程序生成的每个阶段做这些工作:仔细的设计(这个时候画点时间是值得的,必须保证我们对自己的程序有清晰的轮廓后才能开始动手写)、编写代码时、单元测试(单元测试的重要性就不在赘婿了)、功能测试。
仔细的设计:这个的仔细是说在程序员编写代码之前,其必须对代码的整个结构以及逻辑结构有明确的清晰的了解,只有这个时候才可以去写代码。这里没有谈到文档,但我说到了一定要清晰的思路,但清晰的思路不是每个人都可以在脑袋中直接形成的,很多人都是普通人,没有办法在脑袋瓜中把所有问题都想清楚,那么就记下来,特别对于复杂的逻辑。
编写代码:对于没有把握的代码,例如:新设计的算法,最好保证其正确性。可以单独将这部分测试,这可以让代码模块化的同时又保证了代码的正确性。一句话:少量的代码保证质量还是比较简单的。
单元测试:单元测试的重要性不在赘叙了,现在也有许多工具可以帮助程序员并减少工作量。
功能测试:程序员保证自己代码质量的最后一关;为了做这样的工作我们可能必须写一些代码来测试,甚至是测试工作。使用大量的 CASE 来测试,以及错误的 CASE 。这里和测试人员的测试不同之处在于:仍然让程序员的注意力放在其自己的代码范围内,减小了排错的难度。
如果你通过了以上的步骤都找不出你程序中有任何问题的话,那么我想你的程序应该足够健壮了。其实还有一点必须说明的就是:代码 REVIEW 。
前面说道了程序员对待别人代码的态度是挑剔和学习的态度,所以让其他程序员来 REVIEW 你的代码也是检查程序有没有逻辑错误的很好的办法。团队中应该交叉 REVIEW 代码,这是实践的经验。
作为一个好的程序员必须有以上的习惯,以及对待自己代码象孩子一样,我们要爱惜我们的代码,同时也要让代码走正确的路。
㈡ 程序员连续加班导致情绪崩溃,该如何学会自我调节呢
一、具体事件经过2020年11月6日一位厨师在餐厅里发现一位男子在与家人通话时一直泪流不止,情绪非常崩溃,所以他在炒饭的时候特意多煮了香肠和荷包蛋,将其摆成了“100”的数字,并且安慰道总有一天会苦尽甘来的,这位男子听完之后恢复情绪之后非常感谢他。
接着就是寻找产生不良情绪的原因,只有清楚地知道不良情绪产生的原因,才能够对症下药,真正地消除不良情绪,才能够使得自我调节得到最佳的效果。凡事都是有因果的,改变因才可以牵动果的发生。原因的确定是方法寻找的前提,也是不良情绪消除的重要一环。程序员情绪崩溃,因为这是他第一次负责的项目,很可能是因为项目不在自己的能力范围内,无法顺利完成这一项目,所以分析其原因就是自己在工作上遇到了难题。
最后就是根据找到的原因,寻找解决的方法。就这一件事而言,程序员可以先通过倾诉的方式释放自己的不良情绪,让情绪得到一定恢复之后,就这一项目的难题向他人请教,找出解决问题的方法。只有这一事件本身得到解决之后,这一不良情绪才能够根除。
㈢ 青岛的外卖小哥帮崩溃的程序员写代码,你如何看待外卖小哥的这种行为
乐于助人的行为,还是很值得赞扬和学习的,毕竟当时那个男子情绪有点奔溃,情绪也有很不好,挺赶巧的碰到这个外卖小哥,帮了他一把,才缓解了男子的压力还有情绪,对于我们来说可能是微不足道的小事,但是对于当时那个奔溃的程序员来说,外卖小哥应该就是个救世主吧。他们之间能够相遇也是一种缘分。真的是正能量满满。
现在很多外卖小哥都是多才多艺。这几年外卖的大军突起,同时出现了很多送外卖的人员,经常能在新闻或者短视频上面刷到他们,之前还有一个外卖小哥帮忙打游戏,用流利的英语和外国人沟通,做一些手工活等等,好像他们什么都会,十项全能,乐于助人,让人佩服。
每年都有很多关于外卖小哥的故事,每个故事背后都很感人,每个人的生活都不易,不过幸运的是,我们身边都会出现一些温暖的人,还有一些温暖的事情,
能够感动很多人的内心,善良的人都是会收到回报的,人间值得。
㈣ 当一个程序员写不出代码了,该怎么办
说明技术不够,还得多学多练习。平常注意多多休息,良好的充足睡眠,才有更好的记忆力。
㈤ 青岛外卖小哥帮崩溃程序员写代码,你如何看待他的行为
我们的生活节奏在不断的加快当中,很多人为了让自己的休息时间有更多,点外卖已经成为了很多加班年轻人最正常不过的事情了,他们可以利用等待外卖到来的时间里面,做更加多的工作,企图可以更快的把手头中的工作解决了,之后就可以提前下班回家休息了,在这样的社会风气之下,更加多的人员都会点外卖,就为了减少不必要的吃饭时间,让自己投入到更加紧张的工作当中去,而这样只会引发人们对于身体健康的危机,仿佛也把工作的时间延长,让自己难以有休闲的余地。
㈥ 如何定位Release程序崩溃原因
以下是几种常见的崩溃现象及对应的处理办法:
1. 对于Release版本必现的崩溃且在Debug版本上也崩溃的程序。
解决思路:去掉所有断点,直接在Debug版本上运行程序,在程序崩溃时,VC会自动跳转定位到崩溃代码行, 这种方法最简单也最常用。
2. 对于在Debug版本上不崩溃但Release版本崩溃的程序,很有可能是Debug和Release版本的差异。例如Debug版本所有成员在构造时会被清0,而Release版本所有成员在构造时是内存里面的原始值,而且Debug有运行时库做保护,这些都会导致某些程序在Debug正常而Release崩溃。
解决思路:1)在程序中加打印,通过程序崩溃之前的打印定位出错位置; 2)逐段注释代码,直到程序不崩溃为止。这种方法耗时较长,对程序员要求较高,而且对于那种不是必现的bug或者很难搭建执行环境的情况就较难处理了。
3. 对于在客户现场崩溃的情况,显然不适合直接带一台电脑去调试。
解决思路:应该有文件记录下崩溃信息,客服人员可以将崩溃信息文件发送给程序员,以便程序员查询崩溃原因,然后利用编译时生成MAP文件(工程信息文件,存放在版本编译机中)的信息来定位问题函数或问题代码行。下面就这种方法展开讨论一下:
3 解决过程
对于上节第三种情况,也是最难解决的情况,解决过程如下:
1. 崩溃回调注册,拦截Windows程序崩溃;
2. 在回调处理中,输出崩溃原因,崩溃内存地址,崩溃堆栈;
3. 工程输出map文件;
4. 通过崩溃内存地址以及map文件找出崩溃的函数。
5. 使用COD文件精确定位崩溃行
3.1 崩溃回调注册
实际上,只靠Windows的错误消息对话框提供的信息量是很有限的。用SetUnhandledExceptionFilter注册自定义错误处理回调函数,可以替换Win32默认的异常处理过滤器(top-level exception filter),而且能打印出崩溃堆栈,这对定位崩溃原因非常有用。
SetUnhandledExceptionFilter的函数原型:
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter );
功 能:注册和注销异常处理回调;
用 法:第一次调用注册异常处理回调,第二次调用注销;
返回值:返回当前的exception filter。需要保存这个函数指针,在注销异常处理回调的时候,以此为参数再次调用SetUnhandledExceptionFilter。打印异常处理也需要此值。
参数: 异常处理的回调函数;
3.2 输出崩溃信息
崩溃信息在异常回调函数中打印,输出到程序执行目录下的文件:
异常处理回调的函数原形:
LONG WINAPI CallBackDebugInfo ( EXCEPTION_POINTERS *pException);
功 能:异常处理回调处理,打印崩溃信息;
用 法:注册自定义错误处理回调:SetUnhandledExceptionFilter (CallBackDebugInfo);
返回值:EXCEPTION_CONTINUE_EXECUTION – 错误已经被修复,从异常发生处继续执行
EXCEPTION_CONTINUE_SEARCH – 继续查找异常过滤器
EXCEPTION_EXECUTE_HANDLER – 正常返回
参数: 崩溃信息结构,包含崩溃原因、崩溃模块、崩溃地址、崩溃堆栈等;
常见崩溃原因有:
EXCEPTION_ACCESS_VIOLATION = C0000005h 读写内存错误
EXCEPTION_INT_DIVIDE_BY_ZERO = C0000094h 除0错误
EXCEPTION_STACK_OVERFLOW = C00000FDh 堆栈溢出或者越界
EXCEPTION_GUARD_PAGE = 80000001h 由Virtual Alloc建立起来的属性页冲突
EXCEPTION_NONCONTINUABLE_EXCEPTION = C0000025h不可持续异常,程序无法恢复执行,异常处理例程不应处理这个异常
EXCEPTION_INVALID_DISPOSITION = C0000026h在异常处理过程中系统使用的代码
EXCEPTION_BREAKPOINT = 80000003h 调试时中断(INT 3)
EXCEPTION_SINGLE_STEP = 80000004h 单步调试状态(INT 1)
3.3 输出map文件
map文件记录程序的全局符号、源文件和代码行号信息,是整个程序工程信息的静态文本。通过文本阅读工具如Ultra Edit或记事本就可以打开Map文件。
在 VC 中,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入:/Zd ,然后选择 Link 选项卡,选中“Generate mapfile”复选框。并在最下面的 Project Options里面输入:/mapinfo:lines,表示生成 map 文件时,加入行信息。
最后编译就可以生成 MAP 文件,可以在工程的Debug或Release目录下找到刚刚生成的MAP文件,文件名为“工程名.map”。
3.4 使用map文件找出崩溃函数
通过上面的步骤,已经得到了 MAP 文件,那么我们该如何利用它呢?下面一步步演示使用MAP文件定位程序崩溃行的过程。
1.我们先在代码中加入非法内存操作(最常见的异常)的代码:
BOOL CMainFrameDlg::OnInitDialog()
{
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);
s32 *p = NULL;
*p= 123;
2.执行程序,程序在开始就异常,在异常打印文件中打印了如下信息:
======================== 崩溃信息 ==========================
崩溃时间: 2009/06/02 16:58:22
崩溃原因: 非法内存操作
异常代码 = c0000005
异常地址 = 0x0045a76f
异常模块: E:\ccroot\liuxiaojing_Enterprise\Enterprise_VOB\70-nms1\pcmt2\prj_win32\Release\pcmt2.exe
Section name: .text - offset(rva) : 0x0005976f
---------------------- Trips of Stack ----------------------
E:\ccroot\liuxiaojing_Enterprise\Enterprise_VOB\70-nms1\pcmt2\prj_win32\Release\pcmt2.exe
name : pcmtver - location: 2bef
3. 确定崩溃地址是:0x0005976f,在Map文件中定位函数:
0001:00059420 ?OnCreate@CMainFrameDlg@@IAEHPAUtagCREATESTRUCTA@@@Z 0045a420 f MainFrameDlg.obj
0001:00059460 ?SetTooltips@CMainFrameDlg@@AAEXXZ 0045a460 f MainFrameDlg.obj
0001:00059700 ?OnTranslate@CMainFrameDlg@@IAEJIJ@Z 0045a700 f MainFrameDlg.obj
0001:00059730 ?OnInitDialog@CMainFrameDlg@@MAEHXZ 0045a730 f MainFrameDlg.obj
0001:00059a10 ?OnSysCommand@CMainFrameDlg@@IAEXIJ@Z 0045aa10 f MainFrameDlg.obj
0001:00059c20 ?OnPaint@CMainFrameDlg@@IAEXXZ 0045ac20 f MainFrameDlg.obj
根据00059730< 0005976f < 00059a10 ,确定是在CMainFrameDlg 的OnInitDialog函数中的某一行产生了异常。
3.5 使用map代码行定位崩溃行区间
Line numbers for .\Release\MainFrameDlg.obj(E:\ccroot\liuxiaojing_Enterprise\Enterprise_VOB\70-nms1\pcmt2\source\MainFrameDlg.cpp) segment .text
498 0001:00059647 499 0001:00059667 501 0001:0005966e 502 0001:000596af
503 0001:000596ed 506 0001:00059700 507 0001:00059703 508 0001:00059708
510 0001:0005970f 511 0001:00059720 512 0001:00059723 515 0001:00059730
516 0001:0005974e 521 0001:0005976d 524 0001:0005977e 526 0001:0005978b
我们在map文件的代码行信息里查找不超过计算结果0x0005976f,但可以找最接近的数。发现是MainFrameDlg.cpp 文件中的:521 0001:0005976d,而程序实际崩溃行在519(注释行和空行也要计算在内),非常接近实际崩溃行了,考虑到程序实际执行的是汇编指令,我们可以在(516 ~524)行区间内寻找到实际崩溃行。
3.6 无法定位崩溃的情况
但是这种输出文件的方法也不能定位所有崩溃问题,俗话说得好:没有万能的救世主。
例如我们有时会碰到下层编解码器崩溃,崩溃打印如下表:
======================== 崩溃信息 ==========================
崩溃时间: 2009/05/07 09:48:17
崩溃原因: 非法内存操作
异常代码 = c0000005
异常地址 = 0x02163b32
异常模块: C:\WINDOWS\system32\kdg7221.acm
Section name: .text - offset(rva) : 0x00002b32
---------------------- Trips of Stack ----------------------
C:\WINDOWS\system32\kdg7221.acm
这时可以看出是我们的音频解码器kdg7221.acm崩溃了,此时就要考虑我们的音频编解码参数是否设置错了,如果没有设错,bug可以转到媒体处理层或者软件一部处理。
㈦ 青岛外卖小哥帮崩溃程序员写代码的视频走红网络,此事件的原委是什么样的
作为成年人,我们每一个人都要肩负着许多压力,负重前行,为了自己和家人更美好的生活。青岛外卖小哥帮崩溃程序员写代码的视频走红网络,此事件的原委是什么样的?关于这个话题,让我们一起来讨论一下吧!
关于“青岛外卖小哥帮崩溃程序员写代码的视频走红网络,此事件的原委是什么样的?”这个话题,以上就是我的观点,各位有何想法?欢迎到评论区积极留言。
㈧ 程序员加班崩溃,青岛一外卖小哥主动帮忙写代码,这一幕有多暖心
这件事情的开头就是这位程序员和朋友在饭店一起看球赛,可是吃饭途中没有想到公司电话不断,可能是有什么需要及时解决,小伙子不得不拿出随身携带的笔记本,因为房间内比较嘈杂,他径直走出门外坐在台阶上打开电脑,可能是因为比较着急看球赛,一时间操作不当乱了套有些崩溃,结果刚好有一位外卖小哥经过,耐心的询问之后,然后拍拍这位程序员肩旁,坐下来耐心帮其解决了,这个视频一经发出,网友们都赞叹声一片,所以好感叹,外卖行业人才济济啊!
外卖行业虽然是个备受争议的职业,但是有多少人愿意这样简单快乐还能乱跑的岗位,没有拘束,没有上下班的限制,自由愉快,向往这样简单生活的人也是单纯而善良的,他们让我们的生活更加了便利,然而爱心又是无处不在。
㈨ 青岛外卖小哥帮崩溃程序员写代码的视频走红网络,网友对此有何评价
青岛外卖小哥帮助崩溃程序员写代码。大家就是觉得打英语是真正的高,人往往都是出现了一些奇奇怪怪的地方,而且外卖员这个行业确实是容纳百川什么样的人都有,有人确实是没有什么文化水平,只能被迫做这个,但有人是选择做这个那是不一样的。
有很多人最终选择了跨行业,不做自己原来的行业了,选择去送外卖,是因为原来的行业压力太大,人家并不是只能送外卖,而是说选择送外卖这种方式作为调节自己压力的一种选择,因为不同的行业的人本身的视角就不同,没有送过外卖的觉得送外卖虽然辛苦一些,但是每天也能看到很多路上的风景,如果不单纯的是为了赚到更多的钱的话,就是除了透透气顺便赚点零花钱,那这也算是一个不错的选择,虽然刚开始的时候也都不好做,水很深。
㈩ 当程序员写不出代码了,该怎么办
你已经对着电脑 n 个小时了。敲键盘正成为一种负担,你在想,键盘是否就像西西弗斯推着的那块巨石。
咖啡一杯接着一杯。不敢再喝了,因为搞不好要有副作用了,心跳加速,身体不由自主地颤抖,出冷汗,但还是无法产出任何代码。
所有重新发现编程趣味的努力都徒劳无功,因为你的最后一点能量都用来驱逐大脑中正在攻城略地的话:
“我写不出代码了!”
总的来说,这个理念就是要你忘记手头的问题,让你的意识心灵沉浸到其他的事情中。此时,你的潜意识则开始连接要点,朝着顿悟的方向前行。
我们可以做些什么以便于帮助大脑在发散思维的模式下工作呢?放轻松就好了:
散步(古代哲学家非常习惯于在走路时演讲,因为他们意识到走路有助于思考)
清理办公室或住所(完成后给自己一个奖励)
与朋友约会,和杯咖啡,聊聊八卦(如果你过于关注问题的话,那么建议和不能提供帮助的非编码人员交谈)
最后再说一句,如果你绞尽脑汁,却仍然无法解决问题,那么不妨先放一放。通过潜意识的运作,搞不好突破性的想法就会灵光乍现。