
DEBUG
文章平均质量分 79
imred
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。
展开
-
Linux:使用vim编辑文件为什么会影响目录的mtime
touch一个存在的文件,文件的mtime发生了更新,文件所在目录的mtime不会更新;而使用vim编辑这个文件后再保存,文件和文件所在目录的mtime都会被更新。为什么会这样呢?本文将解释一下这种现象的成因。原创 2024-07-18 23:35:28 · 663 阅读 · 0 评论 -
Linux:利用内核日志记录系统启动时产生的进程树
前言之前项目中遇到过一个bug,bug产生的原因是某个程序在两个不同的启动脚本中被同时启动了两次,系统中出现了两个实例。这个程序在代码内部没有保证单实例,靠shell脚本的pidof(1)命令保证单实例,然而因为两个启动脚本的启动时间太过接近,pidof(1)没能起作用,导致程序被启动了两次。出了这个bug后就想着需要梳理一下系统在启动时都运行了哪些脚本,这个系统“传承”了估计有七八年,启动脚...原创 2020-04-12 16:07:39 · 910 阅读 · 0 评论 -
Qt在Linux下如何查找可用字体
最近遇到一个问题:一个Qt程序在Windows上正常运行,在Linux下编译运行后汉字就全变成方块了,成了名副其实的“方块字”。我一开始考虑是字符编码问题,调用QChar::unicode检查中文字符的编码,发现没有问题。如果不是编码问题,那就需要考虑是字体问题了。然后就安装了文泉驿字体,然后将控件字体设置为文泉驿,发现还是没有用。调用QFontDatabase::families检查所有可...原创 2019-04-09 20:58:13 · 4331 阅读 · 0 评论 -
C++:shared_ptr的隐式转换
最近遇到这样一个编译问题,代码是这样的:#include <memory>#include <iostream>class Base{public: virtual ~Base() {}};class Derived : public Base{public: ~Derived() {}};void processSpBase(s...原创 2019-03-22 00:04:03 · 5117 阅读 · 0 评论 -
Linux C/C++调试之二:使用strace追踪程序系统调用
在之前的一篇文章中,我介绍了一种调试手段:利用LD_PRELOAD机制,拦截动态链接器对动态库的符号解析,达到监控程序IO的目的。事实证明我还是太naive了,我们大可利用现成的工具——strace,来更好地完成这一项工作。strace不只能跟踪程序IO,它能跟踪程序的所有系统调用,实现的基本手段是ptrace系统调用,不过实现细节还没研究过,今天只总结一下它的用法。首先用strace来跟踪一...原创 2019-03-02 18:27:42 · 3217 阅读 · 0 评论 -
Linux下对input设备调用ioctl时指定EVIOCGBIT选项时的缓冲区该多大
我们有时候需要获取/dev/input目录下的eventX设备支持哪些事件(EV_KEY、EV_REL和EV_ABS等),可以通过ioctl调用指定EVIOCGBIT(ev, len)选项来获取,例如:ioctl(fd, EVIOCGBIT(0, EV_MAX), buf);来获取fd设备支持的事件。这涉及到一个问题:buf需要指定多大的长度? EVIOCGBIT宏的第二个参数是事件标志...原创 2018-09-12 22:57:26 · 3933 阅读 · 2 评论 -
gdb的watchpoint在系统调用中被修改似乎不会被触发
今天遇到一个越界写问题,覆盖了栈底的金丝雀值,导致运行时报“*** stack smashing detected ***”。一开始尝试用gdb的watchpoint定位,但就是眼睁睁的看着运行结束后金丝雀值被修改而没有触发watchpoint,最后无奈一行行的定位,发现是一个ioctl导致的越界写。 后来我试着研究watchpoint未被触发的原因,在GDB的官方Wiki发现这么一句话:...原创 2018-09-09 22:54:39 · 1259 阅读 · 0 评论 -
Linux C/C++调试之一:利用LD_PRELOAD机制监控程序IO操作
引言有时,我们为了分析程序的某些问题(例如性能问题),需要对程序的IO操作的频率耗时等数据进行监控。就以经常调用的read和write函数为例,如何监控程序中所有上述两种操作,同时进行计时呢?使用gdb打断点自然是个方法,这样可以很容易发现程序中所有的调用,但是这样就没办法计时了。如果在程序中所有read/write函数前后打上时间戳,就可以实现计时了,但是这会有另一个问题,我们可能调用了某些...原创 2018-07-18 22:52:37 · 2792 阅读 · 0 评论 -
Linux可用内存充足时进程常驻内存被淘汰的问题
最近遇到这样一个问题:生产环境的某个C++ GUI程序界面时常出现卡顿问题,经过排查与进程的大量IO有关,但是奇怪的是,即使IO已经结束,操作界面时仍然会有卡顿问题。继续排查,发现进程常驻内存的代码段和数据段在大量IO之后变小了,排查过程如下: 为了复现整个过程,使用以下demo代替GUI程序,能得到类似的效果:#include &amp;lt;stdio.h&amp;gt;const int ARRA...原创 2018-07-11 00:29:03 · 1707 阅读 · 0 评论 -
Qt无法使用qDebug()输出QEvent对象详细信息的解决方法
长话短说,QDebug operator<<(QDebug, const QEvent *);这个函数声明在qevent.h中,这个函数实现了使用QDebug对象获得QEvent对象详细信息的功能。我们为了使用QEvent类通常会#include <QEvent>,尴尬的是QEvent文件中并没有包含qevent.h文件,而是包含了qcoreevent.h文件,...原创 2018-04-13 00:08:41 · 1792 阅读 · 0 评论 -
CSAPP第三版运行时打桩Segmentation fault
CSAPP第三版7.13.3节提到了运行时打桩机制,它可以在运行时将程序中对共享库函数的调用进行截获,替换为执行自己的代码。这个机制基于动态链接器的LD_PRELOAD环境变量。如果LD_PRELOAD环境变量被设置为一个共享路径名的列表(以空格或分号分隔),那么当加载和执行一个程序,需要解析未定义的引用时,动态链接器(ld-linux.so)会先搜索LD_PRELOAD库,然后才搜索任何其他的库。原创 2017-08-19 23:53:13 · 2918 阅读 · 13 评论 -
“无法定位程序输入点_ZdaPvj于动态链接库Qt5Cored.dll”的解决办法
这个是由于在环境变量中找到的库的版本不兼容,一般来说最简单的解决方案就是把Qt SDK的路径放在在环境变量的最前面。原创 2017-01-04 16:08:39 · 9417 阅读 · 0 评论 -
使用 AvanWaves 遇到 parsing error in line0:syntax error
用notepad++把sp文件从CRLF换行改为LF换行即可,同时sp文件路径不能含有中文原创 2016-12-04 22:24:48 · 2766 阅读 · 1 评论 -
虚拟机中 CentOS 无法上网(connect: network is unreachable)
以往记得在VirtualBox中安装完CentOS后是可以直接使用的,今天安装好了以后发现上不了网,表现为使用ping时提示connect network is unreachable。通过ifconfig发现网卡没有分配IP地址,考虑是DHCP的问题,遂sudo dhclient,发现就能上网了。然而重启以后就又没有IP了,所以还要修改一下etc目录下这个网卡的配置文件(/etc/sysconfi原创 2016-12-06 20:48:54 · 29459 阅读 · 7 评论 -
C语言:数组和指针的区别
实际上关于数组与指针的区别这个问题在《C专家编程》已经有很详细的阐释,但我想用自己的语言说一说我的理解。数组是指针?最近在做数据结构课设,其中一个函数发生了令人费解的错误,简化后的代码如下:#include <stdio.h>int main(){ char foo[] = "a"; char **bar = &foo; printf("%c\n", *(*bar));原创 2015-05-02 19:08:07 · 27865 阅读 · 14 评论 -
谨防全角空格
最近实习,把原有的项目数据库从Oracle迁移到MySQL,我主要负责SQL语句的修改,各种坑啊,今天碰到一个令人无语的错误。 SQL语句差不多就是这个样子:SELECT *FROM AINNER JOIN BON A.foo = B.bar AND A.baz = B.qux就是这么简单的语法,就是一直报错,报“AND A.baz = B.qux”处有语法错原创 2016-07-27 17:35:48 · 3117 阅读 · 0 评论 -
Linux:openSUSE DNS 配置错误导致无法上网
舍友使用的是 Linux openSUSE 操作系统,最近两天无法上网,无论是无线网络还是有线网络均无法上网。具体表现为 ping 网关可以 ping 通,但是 ping 百度,或者在浏览器中打开百度都成功不了。 第一感觉是DNS的问题,于是检查系统的DNS服务器列表:$ nslookup>server 无论是使用无线网络(10网段),还是有线网络(192.168网段),上面命令的输出均为原创 2015-04-09 20:42:09 · 3178 阅读 · 0 评论