跟踪c/c++代码的执行流程

gcc提供了编译参数:-finstrument-functions
可以在函数进入,离开某个函数的时候执行一个特殊的回调,这就意味着,我们可以在这个地方做一个事情。
这两个回调如下:

进入函数:
void __attribute__((__no_instrument_function__)) __cyg_profile_func_enter(void *this_func, void *call_site)

离开函数:
void __attribute__((__no_instrument_function__)) __cyg_profile_func_exit(void *this_func, void *call_site)

this_func分别对应了二进制文件的地址,十六进制。
除此以外,还有两个程序开始和结束时候执行的函数回调:

void main_constructor( void )
void main_deconstructor( void )

结合以上知识,写出自己的调试代码,然后,获取每个函数的调用过程:
包含q_debug.h

#define XY_DEBUG_H                                                                                                            

#include <stdio.h>
#include <stdlib.h>

#define DUMP(func, call)  fprintf(fp,"%s: func = %p, called by = %p\n", __FUNCTION__, func, call)
void main_constructor( void ) __attribute__ ((no_instrument_function, constructor));
void main_destructor( void ) __attribute__ ((no_instrument_function, destructor));

#endif

在你的程序里,引入以上头文件,
对应的函数实现:

#include"q_debug.h"                                                                            

static FILE *fp;

void main_constructor( void ) {
    fp = fopen( "trace.txt", "w" );
    if (fp == NULL) exit(-1);
}

void main_deconstructor( void ) {
    fclose( fp );
}
                                                                                                                              
void __attribute__((__no_instrument_function__)) __cyg_profile_func_enter(void *this_func, void *call_site) {
    DUMP(this_func, call_site);
}

void __attribute__((__no_instrument_function__)) __cyg_profile_func_exit(void *this_func, void *call_site) {
    DUMP(this_func, call_site);
}

编译参数附加:-g -finstrument-functions
mac下还需要附加:-fno-pie -g -finstrument-functions

这样将拿到函数的十六进制地址:
比如:__cyg_profile_func_enter: func = 0x100000d00, called by = 0x7fff8b3455fd

地址转文件名和行数:
mac下用:xcrun atos -o fun $l
linux下用:addr2line -e fun $l

其中$l是对应的十六进制地址。

构建一个属于你的PHP MVC 框架—-5.我要一张漂亮的脸:视图控制

视图控制对于一个成型的MVC框架而言,说的是V层。这一层,是跟用户距离最近的一层。
谈到视图,就不得不说到模板,自然也就离不开模板引擎。
很多框架把这一层用成型的smarty来代替,不失为一种不错的解决方案。但是,个人对smarty不怎么感冒,所以,这里说的不是那种办法。其实,个人觉得php本身就是一个天然的模板引擎,对此,何必引入第三方呢。

一种最简单解决办法就是,把需要放入模板中得变extract出来,然后,直接include进来模板文件。ok,解决问题:

简单的demo代码如下:
控制器中的代码:

$view_vars = array(
    'a'=>'A',
    'b'=>'B',
);
extract($view_vars);
include 'b.php'; 

一个简单的视图:

<?php echo $a . $b . "<p>";

当然很多时候需要对输出进行一些控制:
比如说你的应用在之前引用过fonts.googleapi.com里的资源,现在GFW比较厉害,现在引用不到了。
一个直接的影响就是你的页面会打开起来特别特别慢。直到认为那个资源超时,
这个时候就需要把模板里的fonts.googleapi.com替换成一个可访问的域名。
也就是字符串替换。字符串处理不多讲,核心是把模板中得内容转成字符串变量,然后处理,最后重新echo

用到php的输出控制ob_start,ob_end_clean,ob_get_contents
控制器代码,用这类函数wrapper.

$view_vars = array(
    'a'=>'A',
    'b'=>'B',
);
ob_start();
extract($view_vars);
include 'b.php';
$contents = ob_get_contents();
ob_end_clean();
echo $contents; 

这样就可以对contents变量做相应的处理。

echo的高级用法-颜色输出与光标定位

转自:http://blog.chinaunix.net/uid-26495963-id-3189345.html

echo进行颜色输出的时候,要使用参数-e

格式:echo -e “\033[字背景颜色;字体颜色m”

如:echo -e “\033[32;40m”

在上面命令中,”\033[32;40m”表示定义后面文本的颜色,“\033”表示启动一个转义序列,“[”定义开始颜色定义,“0”定义默认的字体颜色,其它部分稍后定义。“32”定义文本的前景色,这里32表示绿色;“40”定义文本的背景色,40表示黑色。

我们一共有8种字体颜色可供选择,它们分别是30 (黑色)、31 (红色)、32 (绿色)、33 (黄色)、34 (蓝色)、35 ( 紫红色)、36 (青色)和37 (白色)。

对于底色也有8种颜色可供选择,只需要将字体颜色的3修改为4即可,例如40、41、42、43、44、45、46、47。

另外,我们还可以用echo进行光标定位

如:echo -e “\033[10;5H\033[31;46mthis is a test”,表示,将光标移到第10行第5列,并输出this is a test字样,该字样前景色为红色,背景色为青色

更多echo输出的控制,具体的摘抄一些如下:

\033[0m 关闭所有属性

\033[1m 设置高亮度

\033[4m 下划线

\033[5m 闪烁

\033[7m 反显

\033[8m 消隐

\033[30m — \033[37m 设置前景色

\033[40m — \033[47m 设置背景色

\033[nA 光标上移n行

\033[nB 光标下移n行

\033[nC 光标右移n行

\033[nD 光标左移n行

\033[y;xH设置光标位置

\033[2J 清屏

\033[K 清除从光标到行尾的内容

\033[s 保存光标位置

\033[u 恢复光标位置

\033[?25l 隐藏光标

\033[?25h 显示光标

附录:

echo: echo [-neE] [参数 ...]

将参数写到标准输出。

在标准输出上显示 ARG 参数后跟一个换行。

选项:

-n 不要追加换行

-e 启用下列反斜杠转义的解释

-E 显式地抑制对于反斜杠转义的解释

`echo’ 对下列反斜杠字符进行转义:

\a 警告(响铃)

\b 退格

\c 抑制更多的输出

\e 转义字符

\f 格式提供

\n 换行

\r 回车

\t 横向制表符

\v 纵向制表符

\\ 反斜杠

\0nnn 以 NNN (八进制)为 ASCII 码的字符。 NNN 可以是

0到3个八进制数字

\xHH 以 HH (十六进制)为值的八比特字符。HH可以是

一个或两个十六进制数字

退出状态:

返回成功除非有写错误发生。