Browsed by
Author: YI

QT程序与gprof

QT程序与gprof

gprof能分析出函数的调用关系以及占用时间,对分析程序性能瓶颈很有帮助。

在采用QT开发时,如果程序分成若干个库,那么仅仅在编译时加入-pg选项是不能产生gmon.out文件,还必须在链接选项中也加入-pg才可以。在pro文件中做如下设置即可:

QMAKE_CXXFLAGS += -pg
QMAKE_LFLAGS += -pg

让人比较郁闷的是,gprof不支持动态链接库和Multi-Thread程序。这实在是非常大的局限。

坑爹的-O2

坑爹的-O2

最近在Linux系统开发程序,一直被一个问题困扰:

在单步调试程序时,程序总是莫名其妙地跳转,没走几步又跳回函数入口;或者干脆跳到一个莫名其妙的、不怎么相干的地方去。

这导致基本上没办法进行单步跟踪调试。一直以为是Linux开发环境太烂了,或者可能是多线程程序调试困难,因此不得不通过加入打印的方式进行调试,费时费力,很不爽。

今天看到一篇文章,讨论了gcc/g++的编译开关-O2,即著名的编译优化开关,传说中能改进程序速度的开关。引起我注意的是,这个开关会“优化”掉代码行的关系,会对代码组织方面进行优化。联想到我遇到的调试问题,不正是无法定位正确的代码行吗?因此检查配置文件,删除了所有的-O2开关,重新编译所有文件。

世界果然清净了!单步跟踪完全没问题,老老实实一步一步地运行!

关闭开关后编译的程序,比打开开关的程序没慢多少。从这个角度将,打开-O2开关实在有些得不偿失。整个程序的优化,还是应当依靠代码设计和实现的优化,通过编译器来优化,结果难以预料,而且优化效果也不明显。

2012-02-24 updated: qmake在debug版本中缺省不加-O2选项,而在release版本中会缺省加上-O2选项。

MySQL诡异的问题

MySQL诡异的问题

一直在本机(kubuntu)上调试和运行MySQL数据库,工作状况良好。某次重启后,再用mysql客户端连接server时,居然出现以下信息:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

检查了一下/var/run/mysqld目录,没有发现任何文件。使用命令ps -A | grep mysql,居然没有发现mysqld进程! mysql居然没有启动!

重新启动mysql服务器(sudo service mysql start)失败,检查/var/log/mysql/error.log,发现mysql启动时crash,不明所以。

后来google了N个帖子后,按照某个帖子的建议,修改/etc/mysql/my.cnf文件,注释掉其中的bind_address行,重启mysql居然就成功了。

可是以前一直工作得很好,没有做过任何改动,诡异啊。

部分香港人,你让人说你啥好

部分香港人,你让人说你啥好

是英国报先骂的“全是笼狗”,还是孔庆东先骂的“很多走狗”?
答:英国报先骂的。

是香港人先骂大陆人“全是蝗虫”,还是孔庆东先骂香港人“部分是狗”?
答:香港人先骂的。

是英国大人先在香港地铁里吃东西,还是大陆小孩先在香港地铁里吃东西?
答:英国大人。

是外国猛男强奸香港女人是殖民,还是大陆妈妈在香港产子是殖民?
答:强奸。

是英国先衰落的,还是香港先衰落的?
答:英国。

美国总统和香港人,谁更瞧得起大陆人?
答:美国总统

以上文字转载自天涯。

警方击毙劫匪,政府奖励20万

警方击毙劫匪,政府奖励20万

新闻是广东某地。让我困惑的是,维持治安不是警察的职责么?破不了案的警察难道不可耻吗?干点本职工作,政府就可以奖励20万?那这些警察平时的“本职工作”是什么?

据说当地个体户还募捐了另外20万奖励警方。。。这算什么?

dpkg-deb常用命令

dpkg-deb常用命令

这个命令主要用于进行deb包的安装和查询等。

build deb包,示例:将/tmp/debian_packages目录下的文件打包成demo.deb文件

dpkg-deb -b /tmp/debian_packages ./demo.deb

查询deb包中的文件内容:

dpkg-deb -c demo.deb

安装deb包

dpkg -i demo.deb
修改MySQL表中字段的缺省值

修改MySQL表中字段的缺省值

网上搜了一下,居然有推荐“先删除字段,再重新添加字段”的做法。如果该字段原来有一些非缺省值的记录,岂不是就丢失了吗? 这真是一点都没有爱啊。

比较有爱的做法是:使用MySQL提供的alter table语句对字段直接进行修改。

例如对tbl_local_users表中的moMaxCalls字段修改缺省值为1,可以采用以下语句:

alter table tbl_local_users alter moMaxCalls int default 1;

如果需要修改字段的类型或者变动位置,则需要用“change column”,例如:

alter table tbl_local_users change moMaxCalls int default 1 after emailAddr;

Chrome为什么会快些?

Chrome为什么会快些?

常见的理由是有一个强大的V8 javascript引擎。而最近在研究Ajax时,无意发现Chrome和IE在处理HTTP基础协议时,实际上也存在很大的差异,这些差异可以导致即使处理HTML/JS文件时,两者的处理速度也会很不一样。

测试时采用Apache 2.2.20(Ubuntu)作HTTP服务器。

在Apache中设置Cache-Control,指定no-cache,我们来看看Chrome和IE会怎么处理。

Chrome发送GET请求,包含If-None-Match以及If-Modified-Since等重要参数。Apache比较对应的ETag以及Last-Modified,发现文件没有改变,因此仅返回”304 Not Modified”。可见,Chrome直接使用了自己Cache的内容,并没有理会no-cache指示。

而IE呢?IE理会了no-cache指示,因此在GET请求中,老老实实地抹掉了If-None-Match以及If-Modified-Since参数,Apache返回200OK并重新携带请求的内容,IE重新处理返回的内容。

从对no-cache参数的字面理解看,IE的处理是正确的,而Chrome显得比较奸诈。

对于某些情况,我们确实需要强制浏览器端重新获取内容(尤其是对javascript文件),此时在Apache中不仅要设置no-cache,还必须设置no-store。

同时设置no-cache和no-store后,IE/Chrome都会向Apache重新请求内容,并刷新本地内容。

Kubuntu/Ubuntu中查看十六进制文件

Kubuntu/Ubuntu中查看十六进制文件

在windows中我们可以安装HxD来查看十六进制文件的内容,在Linux下,更简单,直接使用hexdump命令即可。

例如,我们想查看sysTbl.dat文件的内容,可以使用以下命令

hexdump sysTbl.dat -C