工作碰上的技术问题及处理经验(三)

续上一篇随笔: https://www.cnblogs.com/kingstarer/p/8469016.html 《工作碰上的技术问题及处理经验》(二)

 

我这人记忆力比较差,经常出现有些知识学了不久后就忘了,或者有些问题花了很多时间百度解决后,再过一段时间碰上时只有模糊印象,却忘了具体解决方法。

最近几年工作时我开始有意识地把登记每天工作碰上的技术问题做个简单笔记。

一般上班时间比较忙,只能草草记了一两句话。等过一段时间,我会把这个笔记整理一下,把问题和处理经验整理通顺,以加深自己的印象。

 

20180425:
    source insight 4里面高亮某个单词可以按F8,UE里面高亮可以用shitf+双击单词,vs里面默认没法高亮某个单词。
不过网上有很多扩展插件可以实现这个功能,我就装了一个:" Highlight all occurrences of selected word"
    今天用filezilla上传一个文件,总是上传不成功,但提示为什么不成功,让我有点摸不着头脑。后来偶然发现原来是因为服务器硬盘满了。filezilla这点做得不太好,出错提示太不清楚了。
    make -n 可以用来调试makefile,它能显示makefile实际执行的编译命令(只打印,不执行)。今天一个同事说他修改的代码编译后没生效,我就让他用make -n看一下是不是实际执行了编译。他看了一下编译命令,才发现他.h文件,然而对应的.c文件并没有依赖于该.h,导致执行make后没有重新编译对应的.c,所以代码没生效。make clean后重新编译就好。
    修改了.h后记得make clean,因为很多makefile写的时候都只依赖.c/.cpp,不依赖.h
            
20180502:
    今天学了一个查看IO使用状态的命令:iostat -dmx2

20180504:
    shell的变量与环境变量的区别:都可以使用${变量名}获取变量值,但有 export的变量是环境变量,环境变量会被子进程继承,但普通shell变量不会。

20180508:
    今天在调试程序时发现程序行为飘忽不定,修改的一个bug有时生效,有时不生效。后来才发现由于我系统里面把.放在PATH环境变量第一位,导致启动程序时默认先启动当前目录下的程序。
    而我的测试环境,有好几个目录都放了一个同名的程序。如果不幸在非最新版本的程序目录下启动程序测试,则会出错。
    一般来说,最好不要把.做为PATH第一位


20180510:
    今天用vs编译代码时报这个错:
    ">dbstbl.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失"。
    网上查了一下,是因为代码格式是UTF-8,并且里面有中文。而vs是不支持这种格式的代码的,需要在文件高级保存选项,把文件格式改为“UTF8带签名”



20180517:
    /*宏里面写死了使用变量stMyInf 现在想调用这个宏,但变量名不一样*/
    #define stMyInf (*pStMyInf)
        GET_AR_INF();
    #undef stMyInf


20180520:
    secureCRT设置屏幕显示黑底绿字模式方法:
    options->sessionoptions->emulation->terminal 选择vt100
    options->sessionoptions->appearance->Current color scheme 选择traditional

    secureCRT设置屏幕显示linux彩色方法:
    options->sessionoptions->emulation->terminal
    把终端类型 从vt100改为xterm 并且钩选ansi color复选框

20180521:
    今天发现程序从数据库取出来的数据,结尾总是会多出很多空格。原来以为是因为字段是char类型缘故,
但后来发现不是,字段类型是varchar2。后来发现由于取数时,用char类型数组,其实应该用varchar才对(我们的数据库操作是用pro*c)。
或者在程序开头使用EXEC SQL VAR强制转换,如下例子:
EXEC SQL BEGIN DECLARE SECTION; 
char ename[11]; 
EXEC SQL VAR ac_ename IS STRING(11); 
EXEC SQL END DECLARE SECTION; 
    这个用法在oracle官方的proc开发文档里面有详细介绍,建议大家开发proc程序前先浏览一遍。(全英的,看起来比较痛苦,但值得)

20180604:
    今天出现了一个substr截取字符串时出现半个中文的问题:utf8中文一般是3个字节,gbk中文是2个字节,但substr截取时是按字节截断,所以很可能出现截断了中文字符的问题。
    这个问题可以通过自己写一个substr解决了,之前的开发人员写代码时没考虑到这点。


20180620:
    我个人比较熟悉awk,所以经常需要在windows上使用awk处理一些数据。
之前一直使用unxutils工具包里面的gawk.exe,但最近发现它有两个问题:1 处理的文件行数超过651132时容易出现bug
2 输出中文时只能重定向到文件,不然会报错。
    我尝试过直接下载gnuwin里面的gawk,发现也有这个问题。这个问题我暂时没有找到解决方法。

    今天被oracle的lengthb函数坑了一把:我一直以为lengthb返回的应该是数字,如果传入空字符串,返回的应该是0。实际上,如果字符串是NULL,lengthb返回的是NULL。

20180626:
    sed命令使用正则时需要转义,如:sed 's/abc\|def/xxx/g' 


    如果ftp连接服务器失败,可以在服务患儿使用/sbin/service vsftpd status看看ftp服务是否有启动。如果启动了还是连接失败,可以看看是不是使用了非标准的ftp端口
    netstat -anp|grep -w LISTEN

20180628:
    今天碰上一个bug是由于snprintf函数引起的。原因是snprintf返回可能超过输入在缓冲区的长度(当缓冲区能完整容纳输出的字符串,snprintf函数返回往缓冲区写入的字符数,否则返回缓冲区应该有多长才能容纳输出字符串),而代码没有对这种情况做判断,导致越界。


        
20180701:
    gdb单步跟踪时,如果碰上比较长的循环,一步步跟很累人。可以试试使用until命令,让程序运行到指定代码行时停下来。
    gdb调试过程中,可以使用call命令执行函数。例如运行过程中想退出程序,可以用call exit(0)。

    今天又碰上strncpy没有以\0结尾导致出现bug的情况。

20180702:
    字符集和字符集编码区别:
    Unicode是字符集,UTF8编码是对表示字符集里面字符的一种编码规则,GB18030也是一种编码

20180705:
    今天碰上一个问题,程序core后在当前目录找不到corefile。用ulimit -a和ulimit -c看都没有限制corefile文件大小。
后来偶然间发现corefile生成在了另一个目录下面,原来是在/proc/sys/kernel/core_pattern里面配置的corefile命名规则里面把路径写死了,所以不会在当前目录生成。
    gdb调试多进程时可以用set follow-fork-mode parent/child 来确定fork后跟踪父进程还是子进程。


20180709:
    今天碰上信号处理函数里面打印日志,导致进程死锁的问题。之前一直以为多线程才会有重入问题,没想到单进程也会出现这种问题。

20180710:
    \t默认是补齐8位,但它跟用空格补齐不一样,虽然光标会后移到下一个8的整数倍位置。

20180711:
    今天才知道oracle有insert all的语法,作用是把同一批数据插入到不同的表中。
insert all
into t1(object_name,object_id)
into t2(object_name,object_id)
select * from t;

insert first
when object_id = 1 then
into t1(object_name,object_id)
when object_id <=5 then                      
into t2(object_name,object_id)
select * from t;

20180713:
    ue搜索替换时可以使用特殊字符 ^p(换行) ^t(tab)

20180715:
    今天注意到项目里面的接入进程实现跟我以前做的项目不大一样。以前做的多进程接入功能是先打开一个socket并且在主进程进程bind之后linsten,然后fork多个子进程同时accept等待连接进来并处理。
现在项目的多进程接入实现是使用SO_REUSEPORT选项,该选项使用多个socket可以同时绑定同一个监听端口。这样就不需要先启动主进程再fork子进程了,直接同时启动多个接入进程就行。每个进程都会新开一个socket完整执行bind->linsten->accept。百度查了一下,说这个特性实现的多socket共享端口接入服务器性能比传统的父子进程共享同个socket的效率高一点。

 

posted @ 2019-08-15 00:48  皇家救星  阅读(447)  评论(0编辑  收藏  举报