跨过BUG查找的”最后一公里”

如果你看到一个C程序员在通宵熬夜神情紧张地对着电脑敲代码或阅读代码,多数只有两种可能:一是为了赶进度;二就是查找内存Bug。
                                                                                                                              — 个人感悟
 
昨晚搞到凌晨一点多,终于算是把一个棘手的Bug的来龙去脉搞清楚了。截至到今天,这个Bug已经困扰了项目组两个核心开发同事达三周之久了。

这个Bug的确很难查找:

   – 首先模拟环境下无法复现该Bug;
   – 生产环境下该Bug是随机出现的,发生频率十分低;
   – Bug出现时并未有dump core等明显异常现象出现,系统依旧运行良好。

得到Bug报告后,我的两位同事就开始对bug引发的问题现象进行了分析,得出了内存被污染的初步结论。之后又在生产环境做了GDB attach到进程的调试,甚至替换了生产环境的版本,利用传统的print语句在关键路径上输出提示信息,试图找到引发Bug的真正原因。但做过这些 后,所能得到的结论依旧停留在内存被污染,至于怎么被污染的、在哪个业务流程上被污染的却无从得知。无奈之下,两位同事开始根据 subversion的commit history进行代码比对和分析,试图查找到哪些新增或修改的代码引发了Bug。代码修改量小还好,如果修改数量巨大,这种代码比对就好比大海捞针,我 们无法保证注意力自始自终是集中的,结果两位同事也的确没有从代码变更中发现什么蛛丝马迹。这类Bug会让你有一种有力无处施展的感觉,面对这样 的Bug,我的两位开发人员似乎也失去了信心和思路。

下面简要描述一下这个Bug:

有这样一个字段数目众多的结构体foo_t,这里仅列出bug相关的几个字段e、c、flag、pdata:

struct foo_t {
    … …
    char e[XX_SIZE];
    char c[XX_SIZE];
    char flag;
    data_t *pdata;
    … …
};

业务逻辑是:

if (flag) {
    处理e、c两个字段;
}

   
bug现象:值本是1的flag字段被污染,值变成了0,导致e、c两个字段没有被做处理,从而引发业务异常,导致客户投诉。我的同事曾经做过如 下尝试,以确定内存污染的行为特点,她在flag之前又加了一个字段flag1:

struct foo_t {
    … …
    char e[XX_SIZE];
    char c[XX_SIZE];
    unsigned int flag1;
    char flag;
    data_t *pdata;
    … …
};

在生产环境下运行得到的结果是flag1和flag值正常,但字段c的尾部字节遭到了污染。现象已经十分明确,离真相就差那最后一公里了。

对于上面的内存污染问题,我首先会怀疑在处理flag或c之前的字段时出现了缓冲区溢出,导致后面字段的内容被整体或局部覆盖。不过从bug现象 来看,这个思路也有说不通的地方,那就是为何是c的尾部字段被污染,而不是从头部开始呢?不过我们依旧沿着这个思路追查了e以及e的诸多前驱字 段,细致的分析了代码,但没有发现溢出点。

c或flag的后继字段比如pdata要想污染c或flag则必须具备更多条件,至少要有操作&pdata的代码,之前基本认为这不太可 能。但现在仅有这一条路可以继续走下去了,也只能沿着这条路走下去。事实证明我们走的没错。在后续的处理流程中有这样的一个函数:

int func(void *p, int size)

这个函数本来是用于处理data_t*变量的,但由于编码者的疏忽,将&pdata传给了p,另外size这个参数也传了一个错误的值, 估计是滥用了copy&paste。而func函数体中对p指向的内存地址做了修改,这个修改直接污染了 ((char*)&pdata + size)起始的那片内存块儿,这就是问题的真正原因所在。这样看来pdata并未污染其所在的foo_t实例中的flag或c字段,而是污染了其他foo_t实例中的flag或c字段,因为这些实例都放在一个mem block pool中的,所以这还是一个随机的远距离内存污染^_^。

我走完了BUG查找的最后那一公里,到达了终点。这个BUG的查找确实不易,但并非遥不可及,为何我的两位同事就停在离真相只有一公里的地方而踌 躇不前了呢?对此我也做了一些考量,希望能在日后的BUG查找方面给予帮助。

要跨过BUG查找的那最后一公里,可从如下几个方面着手努力:

* 收罗证据,不放过一处可疑之处

这是准备工作,就好比警察查看罪案现场,哪怕是一根毛发,一处异物也不能放过。一般来说我们至少要收集到Bug发生时的各方面信息,包括:

 - 系统日志
        这个时间点上各个模块的日志都要搜罗到;

 - core文件
        如果bug引发core dump,那core文件是bug查找的最佳入口;

 - 通信数据包内容
        对于很多后端服务程序而言,不合法的通信数据包常常会引发Bug,我经手的类似Bug就不止一起了。必要时通过抓包工具将通信包抓到文件中以备后用。

 - CPU/内存/磁盘实时状况
       千万不要小视这些信息。如果发现CPU过高,则很可能代码存在死循环的可能(后pstack进程号,则可直接找到问题所在);如果磁盘满,则可以很好解释 数据不完整的异常;如果mem占用过高,则可以解释分配内存异常或性能下降等问题。

 - 系统操作日志
       如果有管理员的操作行为的话,我们也不要放过,将操作日志(一般系统都有保存,并需要对这些日志进行定期审核)截取并保留,以备后用。

 - 操作系统/硬件相关异常信息等。
       如果是因为OS或硬件异常导致的Bug,那搜集到这些信息就太重要了,否则你将付出惨重的Bug查找代价。

Bug查多了你就会有这种感悟:证据用时方恨少啊!

* 沉下心,保持清晰思路

BUG有难有易,简单的Bug大家都能应付,而困难的Bug,就要比拼能力和经验了。要想解决掉Bug,务必要沉下心,不急不躁,这是保持大脑始 终有清晰思路的前提。

能用工具(比如GDB)调试出来的Bug,都不是最难的问题,因为现场就摆在你的面前,你可以看到一切蛛丝马迹。最难的问题最终都是要通过脑力分 析出来的。

解决问题前,要根据之前搜罗的证据,形成自己的查找思路。没有思路是可怕的。没有思路的时候,也不要急于开始查,那样只会乱套。应根据已有的蛛丝 马迹,行成一些思路,哪怕这个思路你自己都不是很肯定,先按这个思路做做看,也许走出一步后,你又能收获新的信息,形成新的思路。就这样敏捷地向 前进,边向前探索边定期回顾。

* 知晓原理,缩小查找范围,形成正确思路

要保持清晰正确的思路,开发人员对系统的运行原理要做到十分清楚,这样可以缩小查找范围,重点突破。就好比上面的那个bug例子,我们要知道 c/flag被污染有几种潜在的可能,并形成多种思路,然后沿着这几种可能的思路继续走下去。在这次查找过程中,想必两位同事恰恰是在原理这方面 没有理解透彻吧。

* 质疑,从自己的代码开始

查Bug就要抛弃“不可能”,拥抱“质疑一切”。而质疑要从自己的代码开始。程序员或多或少都有一种“自负”的心态,骨子里会认为自己的代码肯定 是正确的。如果出现问题,一定是其他人代码的问题,哪怕是OS这样总体来说十分稳定的平台也会成为被首先质疑的对象。不过事实证明,错误多出在我 们自己的代码中,毫无理由的去怀疑操作系统、怀疑你使用的第三方库,多半会南辕北辙,浪费你宝贵的查找时间。

* 拥抱调试技巧和工具

必要的调试技巧是Bug查找的基本功底,这些技巧在涉及内存问题查找过程中相当有用。

  — print语句
        不用多说,print语句是最简单、最常用的调试手段,在代码任意位置,根据你的需要,输出信息,帮助你分析bug原因。其唯一的缺点就是可能需要你重新 build代码和部署你的应用。

  — gdb切入进程地址空间查看堆栈
         利用gdb一类的专用调试工具可在代码运行时切入进程地址空间,实时查看数据变化。你也可以在gdb下执行应用,获得同样的效果(适合单进程应用)。
 
  — 调试版中采用magic number + assert
         C程序的bug多为内存问题。常见的内存越界访问或污染的调试手段是在代码中为内存块添加magic number,并在特定环节用assert保证该magic number的值是没有被修改的。一旦值改变了,则说明问题发生在执行流的两次assert之间的某个地方,后续可进一步缩小assert间隙,直到定位 到问题。

  — 让bug尽可能的容易复现
         一个可以在模拟环境下复现的Bug总是比较好查的。出于这个考虑,我们可通过放大问题区域来尽可能更容易的复现bug,比如将一个字节的字段改为4个字 节,这样可能占据更多被污染的区域,比较利于Bug的复现(但这不总是ok的)。

* 把握节奏,避免陷入惯性思维

一些比较难fix的Bug,其查找过程可能会十分漫长,就像这次我们遇到的这个问题。这就需要我们的开发人员把握好Bug查找的节奏,因为长时间 调试和查问题容易让人陷入惯性思维,反倒不利于Bug的查找。一旦意识到自己进入惯性思维后,可考虑换种活动做做,比如出去散散步、洗个热水澡 等。或者给其他人员讲解你的查找思路,这个过程中自己可能会发现思路上的缺陷,或者由他人指出你思路方面的问题。

感觉Bug查找是一门手艺活,要学会慢工出细活,这总比不出活儿的要好,尤其是在面对那些十分诡异的内存Bug时。

港澳行记

我来也匆匆,去也匆匆。
                                    — 某歌词

记忆中和LP一起出去旅行的次数少的可怜,上一次还是在结婚蜜月时,去的是九寨。二人一起出游是很美妙的,印象也是深刻的,至今当时在九寨的情形 还能历历在目。于是年初就和LP定下了今年的一个家庭目标:一起出去玩一次。

不过真正要确定何时以及去哪出游还是很困难的,毕竟工作上的事情和照顾孩子的事情要安排妥当才行。上月中旬LP接到通知:端午前要到公司总部(广 州)接受培训,机会终于来了 – 都到了广州,怎能不去港澳呢!于是我们决定趁此机会去香港澳门玩一通,还能省下来一个人的路费^_^。LP以前是去过一次香港的,像迪斯尼、海洋公园、黄 大仙等景点LP都是游览过的,因此这次LP去香港以消费为主,我尾随并保驾护航。另外我们在是否带果果去这个问题上也纠结了一段时间,最后决定这 次就不带孩子去了。一方面孩子太小,带出去总是不那么放心,那边天气也热,怕她生病;另一方面这次以逛街为主,带孩子十分不便,孩子累,大人也 累。

行程确定

出游第一步:确定行程,否则没法订机票和酒店。和LP商议后,最终确定的行程:

6.9   广州自由行
6.10 入港,购物
6.11 香港,购物
6.12 从香港入澳门,逛景点,买点纪念品,晚上通过珠海拱北口岸回大陆,连夜回到广州,入住酒店
6.13 飞回沈阳

各种准备

LP两年前和同事结伴去过一次HongKong,但以景点旅游为主,对香港购物区了解甚少,因此这次出发前我们还是要做好充分的准备。

    – 订香港酒店。由于到港时恰逢端午假日,因此酒店的价格也是水涨船高,多亏我们提前近20天就预订了(LP在淘宝订的),这才勉强订到价格还算合理,且位置 和质量都属上乘的 – 郎豪酒店(Langham Place Hotel),郎豪酒店离九龙旺角地铁站出口很近,酒店下面就是香港的一个购物中心郎豪坊,酒店是五星级的,一天700RMB,感觉超值。

    – 订往返机票。由于LP只能从广州出发,因此只能订到广州的往返。6月恰逢广交会刚结束,机票折扣较大,因此往返定的都是2.5-3折左右的机票,已经是相 当的划算了。来回算上机场建设费、燃油费才不到1600。

    – 预订广州酒店。我和LP在广州要住上2宿,在网上找了很长时间,发现7天连锁今年有新会员“77元”自主大床房的体验活动,这个价格太合适了。于是和LP 每人注册了一个ID,在7天的广州动物园2分店预订了两天住宿(其他分店要么太远,要么就是客满,无法预订,便宜也有便宜的不足之处)。

    – 买广九直通车车票。坐大巴入港太慢,口岸等的时间也较长,因此我和LP决定坐火车进港。唯一的选择就是广九直通车,最早的一列是8点17左右的,到香港也 就10点多,很舒服方便,就是价格有些小贵,大概是坐Bus的两倍。这个票在12306.cn上是无法订到的,只能在窗口买,或在淘宝上找代理购 买。

    – 买拱北回广州的车票。从拱北回广州的Bus很多,Taobao上有很多代理提供车票服务。

    – 手机卡。这次没有购买香港当地的手机卡,由于客户级别已经在8级以上,开通国际漫游也无需押金,我就直接开通了国际漫游服务。

    – 选择目标购物区。香港的购物区有很多,我们在港也就待两个整天,因此我们需要确定每天的目标购物区。由于住在郎豪坊,因此我们第一天打算就在郎豪坊周围 逛。第二天去著名的海港城周围。

    – 各种打折卡和会员号。自从确定了要去香港,就一直在十六番论坛上潜水,搜罗一堆不知道是否好用的会员卡号,打印出来备用。

蒸笼上的广州

第一次去广州,也第一次感受到了广州的湿热,在大街上背个包走两步就浑身透汗。不识趣的我居然还跑到了越秀公园给五羊雕塑拍照,没想到越秀公园不 是“平原”,雕塑居然在小山上,这让我终于体会到什么叫汗流狭背了,一整包面巾纸都用来擦汗了。就这样走走歇歇,也算把越秀的主要景点逛了个遍。 越秀公园南门是中山纪念堂,我也顺便串了个门,给孙大总统的铜像拍了几张照片。广州的热还体现在即便是进入夜幕,热度依然不减。乘地铁回到住处, 不将空调开得凉凉的是无法入睡的。但考虑到不习惯开着空调睡觉,于是就开开关关,一宿也没咋睡好。

除了热之外,我对广州这座城市的印象还是蛮不错的。和大多数发展中的北方城市不同,广州人民,至少核心城区的人们已经开始享受发展后的成果了,尤 其是2010亚运会后的成果了 – 宽阔完好的道路、四通八达的交通系统、良好的绿化、鲜见灰尘的空气、发达的商业环境、先进的城市管理以及城区中数量众多的公园,这些至少比到处是工地、到 处修路、到处扬尘的沈阳要先进五年以上。没有尘土,马路上的车都是干净的,就算下雨也是没有泥的。

广州的吃食我还算是适应,云吞、肠粉、牛河、炒饭量足,价格也不是很贵,至少比北京是要便宜一些的。我没有特意去广州什么老字号或特色美食去体 验,我就是走到哪里吃到哪里。南方的甜品和汤我不是很感兴趣,所以也没有去体验。天河又一城下面的风行牛奶的西米露倒是买了一杯,感觉很是一般。

习惯了每到一地就去当地的博物馆看看,这次也不例外。广东省博物馆就在珠江北岸,离海心沙亚运公园很近,遥望南岸的广州地标 – 广州塔。博物馆是免费的,但门票最好提前一天预约。不过我去的那天人不是很多,不预约直接领票也很快。与LP一起逛博物馆只能走马观花了,那天博物馆的临 时展览包括“晋国遗珍——山西出土周代文物”、“金枝玉叶——明代江西藩王墓出土玉器精品展”、“静木清缘——金丝楠薄浮雕艺术展”,常设的展览 有:广东省自然资源展览、漆木精华——潮州木雕艺术展览等。个人十分喜欢“广东省自然资源展览”,里面展出了许多矿产、宝石等原始形态,十分开眼 界。

入港

10号早上和LP很从容的从酒店退房出来,坐地铁3站地到达广州东站,准备乘坐广九直通车入香港。直通车提前45分钟剪票,去香港的旅客(绝大多 数都是,应该没有人坐这趟车去东莞)要进行出境检查。直通车的车厢是类动车一等座席那种,但车头应该是普通的那种电力机车车头。车开的速度并不 快,尤其是通过深圳罗湖铁路口岸时车基本是龟速通过。过到香港这边后,火车与香港东铁线似乎走的是一条路线,只是沿路的车站不停罢了,直到到达香 港九龙红勘站。入境手续办理也不算慢,排一会就过去了。接下来要做的第一件事就是购买八达通卡,在香港没有八达通真是寸步难行啊。150港币一 张,离港前可退掉,但我和LP商量了,这次就不退票了,后续还会有很多机会来香港的,到时候只要重新激活一下八达通就可以使用了。

按照之前查找的路线,我们坐东铁线去旺角东站。坐了香港地铁才知道,香港地铁有些是地面上跑的轻铁,和普通火车没啥区别。出了旺角东站,我们就彻 底迷路了:分不清东南西北,周围是熙熙壤壤的人群,马路上穿梭着双层巴士,香港路牌还不是很适应。找人问路,问了几个居然还都是大陆游客。最后问 到一个本地人,告诉了我们去郎豪酒店的方向。我们就顺着走,感觉不对就再问,就这样误打误撞,还真的到了郎豪酒店对面。原来这里离旺角站更近,楼 下是一个H&M店,对面是西武百货,旁边有家翠华餐厅,似乎到了饭点,门口排着等位的人,估计都是慕名而来的大陆游客。

酒店一层有个很小的服务台,站着一位老外,估计是英国人。我们和他咨询如何check in,他似乎中文不是很地道,就用手比划出“八”的姿势,嘴里说什么"爱露",我们一直以为是到第8层办理check in手续,直到他送我们进电梯,我们才理解是到"L"层办理手续 – 电梯的按钮上明显标明了L – 酒店大堂。由于到的还早,酒店尚无房间,我们将行李做好寄存,就下楼开始逛香港。

消费天堂

郎豪酒店楼下就是郎豪坊,不过郎豪坊显然比较高档,很多店铺折扣都不大。我们估计不会在这里购物,于是下楼沿街逛。离郎豪坊不远处就是香港的一条 购物大道 – 弥敦道。在香港想辨别大路还是小道,就看路上双层Bus多少即可。郎豪酒店在弥敦道西侧,弥敦道东侧有通菜街(也就是著名的女人街)、奶路臣街等,这些街 道两侧林立着各类商铺,服装、化妆品、数码、珠宝、手表应有尽有,有些类似国内的步行街,但每个商铺面积都不大。这些街就是我和LP香港逛街的起 点了。

在香港逛街与在内地商场、专卖店逛街也没啥区别。并且在接待过多年大陆游客后,香港的各类店铺的服务员应对操持着普通话的大陆游客都是毫无问题 的。不过我还是总结了一些在香港逛街的几大特点:

   – 店铺冷气足
   香港店铺里的冷气不是一般的足,是足让你感觉到寒冷。游客一般都是短袖裤衩,但店员们都是衬衫西装,估计他们十分了解他们所处的温度环境。

   – 服务意识好
   多数店铺里的服务员服务的意识还是很不错的,不知道是否仅针对大陆游客^_^。据说香港本地人去买珠宝,一般都被要求“等会儿”。

   – 关联推销多
    我买了台ipad mimi,店员并不着急结帐,而是向你推销其他产品,比如外壳、贴膜;甚至是将你带到其他柜台,推销与ipad mini毫不相干的产品,比如剃须刀,这是我在百老汇亲历到的。在Nike/Adidas打折店买双运动鞋,她们也会不遗馀力的向你推销100元5双的运 动袜。

   – 珠宝行烂大街,以周大福为甚
    香港珠宝首饰店那叫一个多。以弥敦道为例,沿路两侧,五步一个周大福,十步一个周生生,再迈一步就是一个六福或谢瑞麟,丝毫不夸张。这里面还是以周大福的 店最为多,人气似乎也最旺。

   – 化妆品店林立
    由于免稅等原因,香港的化妆品的确多,而且种类丰富,从小样到套装应有尽有。卓悦、莎莎是香港最著名的化妆品零售店,而且满大街都是,十分方便。

   – 吃,一个也不能少
    网上谈的最多的就是翠华,也许是被大陆客炒起来的原因。我和LP在下午回酒店前去了一趟翠华餐厅,那时候人刚刚减少,排了2分钟就有了座位。点了咖喱牛腩 饭、番茄猪排饭,味道也就那么回事,没啥特殊的地方,价格“不菲”,一共117港币。
    反倒是香港的KFC和麦记相比翠华要便宜许多,我俩没少吃。像许留山这样的甜品店,就类似以前大陆“街客”那种地位。
 
   – 数码电器价格优势缩小
    除了apple系列产品,其他的数码产品在价格上比大陆优势不大,有些甚至比大陆的店还要贵,比如单反相机。佳能650D和700D在百老汇、丰泽和香港 苏宁的报价都比大陆要高出一些,遂放弃之。

下午三点左右,我们打算回酒店休息一下。行李已经被直接放到房间内了,这服务估计只有五星酒店才能享受到。酒店的房间比预象的要好上很多。房间设 计新颖,设备也很新,卫生间有个大浴缸,有电视声音输出,可以边泡澡边收看电视。各种商务设备我们都不是很了解,中央空调太冷,最高温度只能调到 26度,于是关之(触摸液晶屏的),总体感觉一宿700rmb还是值得的,毕竟这是HongKong。

休息后,继续逛街。这次沿着弥敦道一直向南逛,一路路过油麻地、九龙政府合署、佐敦、柏丽购物大道、尖沙嘴;调头逛了一下加连威老道,然后往回 走。当然这期间LP采购了好多东东,这里就不细数了。回到旺角时已经半夜11点多了,感觉好累。到KFC(24小时店)吃了一顿夜宵,回酒店休 息。

彻游海港城

11号早晨从CNN得知神十已经成功上天,甚感高兴,心情自然也不错。今天我们的目的地是海港城。之前就听说海港城巨大无比,一天都逛不完,于是乎早些起 来,整理物品,做出发准备。到海港城可以乘地铁,也可以坐双层Bus,我们选择体验后者 – 在弥敦道乘坐281/A路公交到中港城下车。香港的Bus都是比较舒适的,上下层都是软座,不像国内Bus那样拥挤(国情使然)。香港道路虽然不宽,但由 于大家基本遵守交通规则,所以路上的车开的都是飞快的。不过感觉随着大陆游客的增多,“中国式”过马路的现象在香港也越来越多了。

中港城在海港城的北侧,楼上是登船的闸口,楼下则是折扣店,虽然面积不大。由于到的比较早,就在中港城解决了早餐,并顺便到楼上打听一下第二天乘船到澳门 的事宜。多亏提前打听了一下,原来船票是有限的,我们打听的时候,第二天的船票都已经基本没了,于是赶紧用之前从taobao买到的换票券换了两张第二天 中午11点的到澳门的船票。

海港城是由多个商场组成的联体建筑,因此显得格外庞大,进去后都不知道该如何逛,即便拿到了导游图依旧比较懵。还好经过几轮服务人员的指点,终于“找到了 北”。海港城里面的商品也不甚便宜,折扣也没有想象中的大,当然这和我们的钱包有限还是有关系的^_^。海港城二层的露台是个理想的观看海景的地方,远眺 远处就是铜锣湾、上环一带的密集楼宇,还有海上穿梭往来的各种TurboJet,很是漂亮。

逛完海港城内部的时候已经是下午5点多了。出了海港城才发现外面有好多顶级品牌专卖店,比如LV、Gucci,店外居然真的有人在排队等待入店。我们不会在这些店里购物,也就看看热闹罢了。

坐TurboJet去澳门

12号早晨,小雨。飞航是11点钟的,我们的时间还是很充裕的,不过心里有事,起的也就早。和LP商量一下,可以早些到中港城,有时间顺便逛下下面的大奥 莱。在中港城解决掉早餐后,向服务人员打探一下在哪里登船。服务人员说10点那班船可能还有空位,可以试试。我们一想早点到澳门也不错。于是就搭上了10 点那趟飞航的“末班车”。喷射飞航里面的情况要比我想象中的豪华,座位也都是软包的,类似飞机上的那种,空间也相对宽敞。TurboJet启动后,颠簸也 不甚明显,没有明显的晕船迹象。外面一直下着小雨,但浪不大,船因此运行的也比较平稳。坐TurboJet喷射飞航一个小时左右就到达了澳门外港客运码 头。

澳门是一个以赌场、旅游为主的旅游城市,入境后从关口出来,外面到处是各家酒店和赌场的免费摆渡车。我们之前就计划好在澳门本岛逛, 氹仔岛就不去了。于是我们乘坐了新葡京的小巴,一路不到10分钟就到了新葡京。下车后第一件事就是将行李寄存在赌场的寄存处。寄存后,到楼上欣赏各类的赌 博游戏。由于LP不是很喜欢这些,转了两圈我们就离开了葡京。

澳门真的不大,从葡京出来沿着“新马路”向西北走,到民政总属大楼后,向右侧的山上走即可到达澳门著名的大三巴牌坊、玫瑰堂、圆炮台等景点。毫无疑问,大 三巴牌坊经典前聚集的游客是最多的。但我个人感觉澳门的教堂是很值得看的,比如说玫瑰圣母堂,不妨进去坐上一小会,体会一下不同宗教信仰的气氛。大三巴牌 坊周围已然成了商业步行街,街道两侧林立着各类店铺,数量最多,人气最旺的莫过于“钜记手信”了,到澳门的游客估计都会从那里买回小食品作为纪念带回国内 的。另外著名的澳门葡式蛋挞也的确名不虚传,味道甚好。澳门元与港币是可以1:1使用的,估计未来一段时间后,澳门元很可能会退出历史舞台。

连续走了多天,我和LP都十分疲劳了,澳门的其他景点实在是逛不动了,于是早早回到葡京取行李,准备回拱北关闸。葡京有免费的摆渡车,但那天等车的人巨多。担心拱北入境人多、过程缓慢,我和LP遂打了一辆Taxi前往拱北,花了50港币,真够贵的。

拱北口岸的人居然并不是特别多,排了一会儿就顺利通关了,而且也没人对我们的包裹进行检查,我们的心也就放下了。

旅行社的车是晚上19:30的,我们等了一个多点,终于登上了回广州的巴士。一路无话,晚上9:30回到广州杨箕地铁站附近,又倒了趟地铁回到动物园的7天连锁。这次的港澳之行算是结束了。

总结

短暂的旅行不足以让我充分认识和体会到当地的风土人情、风俗习惯等,因此说道起来不是那么深刻,遂仅以流水账的方式细致记之,以备忘。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats