个人的闲暇笔记,有误还请指正,主要是谈网络的基础以及网络组成及网络的划分组网等碎片化的东东:
1.网络的组成:
1)工作站
2)服务器
3)外围设备
4)网络协议
上面的有些东东一直没有变,有些东东变得快,如:服务器变化快,网络协议一直是Tcp/Ip,从IpV4,到IpV6,中间有一个Ipv5,是Ipv4的增强版,现在国家在推Ip6,在现目前的Ip4里跑得最多的是视频这类东东基本上满了,在IpV6里跑的还是这一类东东,教育网什么的,还是以视频为主,但要想大家都用Ipv6还得增强应用的接入才行。
对等网:角色一样,如:大学宿舍(你的硬盘大片多,共享),是一个对等关系。
服务器/工作站:(打印服务器)
局域网/城域网/广域网

根据全国区域,规范各大城市的:

DC:深圳DC/西安DC/天津DC/上海DC
DC主要用来放重要数据

这些AC直接和周边的DC关联起来:
AC:沈阳AC/北京AC/济南AC/南京AC/杭州AC/汕头AC/东莞AC/成都AC/武汉AC
AC主要用来做游戏程序代码的部署

外围:CDN
用来做传文件加速之用

网络传输是看小b:
文件是大B:

如一个1G的文件在一个1G/s带宽里传,则需要8秒,因为:1B=8b,是一个8倍的关系,
如你家宽带是1M,往往下载只有128kb/s,这个1M是指网络上的1M,是小b,而大B要除以8。

对于公司网络的布局:
运营商 公网 管理网(排查服务器故障) 公网<-内网->其他IDC。
最复杂莫过于内网,及其复杂,也不安全,在办工网里和运营的网这一条路是最危险的,险象环生,因为有hack啊,心怀不诡的各种目的的人出现在这条道上,木马什么的,为此,需要一个隔离区来保证安全,而光密码验证也无法满足安全,得有专业的ToKen,说白了就是按什么AES加密后生成一个6位的码,自己有一个前缀在配置后和这6位一块用,这样再牛B的黑客也没有用,3分钟变一次密码快吧?当然也不能说是最安全,最不安全的是人啊,能搞定人,再安全也不安全,什么社会工程学呀,什么的,但不管怎么说这个Token卡是一个较大互联网公司的基石,没有它,还真是得找一个其他类似的办法替代才行。
对于OSI参考模型的探讨,它是一个标准,分层后让各自干各自的事情,如网线生产商,如交换机生产商,你生产的网线在任何交换机上都能用。
网关:类似于QQ发出来的信息,通过应用让MSN发出去一样。

对于电源:
有1+1的电源,1个电源是好的就成。
2+1的电源:有两个电源是好的就成。
1+1+1电源:只要有一个是好的就可以让服务器工作。

现在技术的发展,尤其是视频业的需求,万兆光模块都不是难事。
对于无线的事情:
普通的54M,现在新的802.11n。300M也有了。

对于光纤:
有单模光纤:就是走一种波长的激光,这样传输距离远,失误低,能传几十公里。
多模光纤:就是发出白光,也就是有多个波长的光在里面走,因这个光的方向性(光是有位象的)不一致,不像激光,传输距离近,容易误码。300M左右。

对于路由器:

NVRAM  NVRAM  ROM Flash  CPU 没有用机械硬盘,所以,能长时间开机运行。




这里讲到了为何要划分成子网,子网和路由的关系,子网的算法,我在此找了一个子网的软件供计算,在百度百科里找了一篇文章:
这儿写下看书听讲的心得:
点击在新窗口中浏览此图片
斜杠的含义,如:
如138.96.0.0/16表示B类网络138.96.0.0的子网掩码为255.255.0.0。表示两个8位,也就是255.255,一共16位的子网含义。
阅读全文
http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html

1)shell 分割字符串存至数组



上述代码会输出
one
two
three
four

arr=($a)用于将字符串$a分割到数组$arr ${arr[0]} ${arr[1]} ... 分别存储分割后的数组第1 2 ... 项 ,${arr[@]}存储整个数组。变量$IFS存储着分隔符,这里我们将其设为分号 "," OLD_IFS用于备份默认的分隔符,使用完后将之恢复默认。

2)shell查找某个字符串是否存在的方法:


存在ok值为1,不存在则为0.



${desturlLoopPath}


Shell获取字符串的MD5:
echo -n 'hello'|md5sum|cut -d ' ' -f1
命令解释:
md5sum: 显示或检查 MD5(128-bit) 校验和,若没有文件选项,或者文件处为"-",则从标准输入读取。
echo -n : 不打印换行符。
cut:  cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
        -d 指定与空格和tab键不同的域分隔符。-f1 表示第一个域。参考这里。
这是unix的shell编程语句,意思是如果上一条命令执行后的结束代码不是0则执行下面的命令,知道fi行之前,例子:

(一)

需要修改的属性:
multiple="multiple"  height:auto;
修改后如下:
<select style="height:auto;width:260px;" id="sel-install-path"  multiple="multiple" >


一:
<select name="select" size="1" multiple="multiple" id="select">
我想给一个常规的select加上: multiple="multiple" Jquery怎么加?
二:
那个height呢?
<select style="height:auto;width:260px;" id="sel-install-path"  multiple="multiple" >
开始是一个固定高度,我想修改为auto,怎么弄?
"height:auto;
<select style="height:auto;width:260px;" id="sel-install-path"  multiple="multiple" >

方法:


如果想删除这个多选的属性:


如何获取这个多选是不是真的多选?

判断时的Js:
multiple换成disabled:

对这个多选的Js的Jquery的操作示例:

返回:
[ "/tmp/projectOne", "/tmp/projectTwo"]

(二)jquery 如何修改<a>标签的内容
<a href="javascript:void(0);" onClick="mutiPathBuShuChoose();" id="mutiPathBuShuChooseHref">多目标</a>
$("a#mutiPathBuShuChooseHref").html("单目标");


整体示例:
https://github.com/man-pages-zh/manpages-zh:
yum install man-pages-zh-CN


首先要:yum install man  ,因为用的是centos6.3的最小安装,没有,否则后面配置都无效果。
http://code.google.com/p/manpages-zh/downloads/list
man 1是shell命令,man 2是系统调用,man 3是库函数
GNU GCC 提供了一份关于 MAN 格式的 C++ 标准库的文档,可以在其镜像点
ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/
ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/libstdc++-man.4.4.0.tar.bz2

找一个最新日期的下载。展开包之后将 man/man3 中的所有文件拷贝到系统上已经存在的一个 man/man3( cp man3/* /usr/share/man/man3/.)(cp -Rf man3/* /usr/local/zhman/share/man/zh_CN/man3/) 目录中即可使用。
在/usr/share/man/manX/
其中‘X’代表的是数字,也就是MAN的类别。


1)对于找不到的命令,man会报错:
[jing@CentOS locale]$ man abc
Cannot open the message catalog "man" for locale "zh_CN.UTF-8"
(NLSPATH="/usr/share/locale/%l/LC_MESSAGES/%N")
实践Ok:http://www.jackxiang.com/post/5711/
解决URL:http://www.2cto.com/os/201111/111711.html
[实践OK]将en下的man复制过来,先凑合用用:
cp /usr/share/locale/en/LC_MESSAGES/man /usr/share/locale/zh/LC_MESSAGES/
http://www.jackxiang.com/post/5711/



GNU GCC 提供了一份关于 MAN 格式的 C++ 标准库的文档,可以在其镜像点(http://gcc.gnu.org/mirrors.html)中下载。具体的路径是:ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/libstdc++-man.4.4.0.tar.bz2,可找一个最新日期的下载。展开包之后将 man/man3 中的所有文件拷贝到系统上已经存在的一个 man/man3 (/usr/share/man/man3/.)目录中即可使用,我的位置是:/man/libstdc++-man-4.4.0/man3# cp * /usr/share/man/man3/.。

可首先 man C++Intro 阅读 Introduction to the GNU libstdc++-v3 man pages。

对于 cout,你需要知道它是 std::ostream 类的一个对象,所以应该 man std::ostream。

摘自
http://bbs.chinaunix.net/thread-869423-1-1.html

阅读全文
今天在FreeBSD上调试代码时,突然我的jar出现了这个错误!上网找了好多资料没有找到解决的办法,后来问同事才解决 了这个问题!(*^__^*) 嘻嘻……
问题:E513: write error, conversion failed (make 'fenc' empty to override)"
原因:新建的文件编码有问题。
解决办法:
先查看一下当前的编码:
:set fenc?
如果不是utf-8的编码格式,用下面的命令改成utf-8的格式
:set fileencoding=utf-8
就可以解决了!我的问题是这样解决的!仅供参考!

阅读全文
Html:

editor是全局:



获取富文本编辑器获取内容:
1)防止对.svn目录下的PHP的访问:

2)整个站点的配置如下:
root@192.168.1.105:/usr/local/webserver/nginx/sbin# ./nginx -V
nginx version: nginx/1.2.2
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/software/nginx_http_push_module-0.692 --add-module=/root/software/ngx_cache_purge-1.3

出现:
root@192.168.1.105:~/software/nginx-1.2.2# sh /root/runnginx.sh
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:157
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:181
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:200
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:230
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:274
nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/webserver/nginx/conf/nginx.conf:304
像这样的,不要放在server里,将/usr/local/nginx/conf/nginx.conf 里server段里的下面的日志代码移出放到该server段的后面即可。:
    log_format  welog  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
     access_log  /var/log/nginx/access.log  weblog;
              }

注意,下面的日志是放在server之外的,即出现警告是放的位置不对    
    log_format  welog  '$remote_addr - $remote_user [$time_local] "$request" '  
                       '$status $body_bytes_sent "$http_referer" '  
                       '"$http_user_agent" "$http_x_forwarded_for"';  
     access_log  /var/log/nginx/access.log  weblog;  
默认并没有开启gzip功能。需要修改apache的配置文件进行开启。

什么是gzip,开启gzip的好处。
开启方法如下:
1. httpd.conf中打开deflate_Module和headers_Module模块 VickieXu
2. httpd.conf中添加: Vickie博客



首先查看apache是否加载了mod_deflate.so模块,如果没有需要安装加载。找到并下载和当前apache版本相同的源码文件,解压缩到/home目录下,在apache安装目录下执行:
/usr/local/apache2/bin/apxs -i -c /home/httpd-2.0.63/modules/filters/mod_deflate.
会自动在 httpd.conf添加
LoadModule deflate_module modules/mod_deflate.so

/usr/local/httpd-2.2.10/bin/apachectl restart
httpd: Syntax error on line 254 of /usr/local/httpd-2.2.10/conf/httpd.conf: module deflate_module is built-in and can't be loaded
解决方案:出现这个情况,表明deflate_module模块是内建的,不用再调入,所以只需要把LoadModule *** 注释就可以了

Egg:
/usr/local/httpd-2.2.10/bin/apxs -i -c /tmp/httpd-rebuild/httpd-2.2.10/modules/filters/mod_deflate.c
chmod 755 /usr/local/httpd-2.2.10/modules/mod_deflate.so

怎么知道开启了Gzip呢?用Httpwatcher或者FireBug抓包如下:
Content-Encoding  gzip  这个即是。

响应头信息原始头信息
Accept-Ranges  bytes
Connection  close
Content-Encoding  gzip
Content-Length  892
Content-Type  text/html; charset=GB2312
Date  Fri, 13 Jul 2012 12:02:08 GMT
Server  Apache
Vary  Accept-Encoding
CentOS 6.3 发布 附ISO下载地址:
http://cnbeta.com/articles/196464.htm
7月全球Web服务器市场:Apache份额下滑 Nginx上涨:
http://cnbeta.com/articles/196487.htm
防护软件QQ电脑管家提示系统关键项目启动慢,于是找了一下网上的,如下优化:
内容太多了,建议下个优化大师优化一下,默认优化下,这种情况主要是系统的一些外部的设备,如Usb,硬盘等的驱动等待时间,导致系统慢,如果要想快,建议加上固态硬盘,关闭Usb等一系列的外部设备,重新安装全新的Xp系统,这样会有明显的改善,而如果是长时间运行了很久的系统,按下面的方法,未必有效果,但还是贴出来供大家参考一下,如下:阅读全文
on this host the function 'date("g")' don't work properly. Now, the function should return 13, but return 7. It has a delay of 6 hours.

Someone can help me?


It probably gets the server timezone, GMT -8
Would setting time zone work in one of your global configuration files?
For example setting time zone to Brisbane, Australia
PHP Code:
http://www.cnblogs.com/in-loading/archive/2012/04/11/2442697.html

http://code.google.com/p/phpquery
发现已经有人做的相当完备了
http://stackoverflow.com/questions/260605/php-css-selector-library
----------------------------------------------------------------------------------------------
JQuery是一个非常著名的JS框架,提供了对DOM文档的完整操作。这个文档处理利器现在终于有了PHP版,也就是说可以使用php操作 HTML或者XML文档,遍历文档的节点,很轻松的取出,填充节点内容。或者简单来说,除了js的事件响应部分,其余的几乎都可以用php来实现。php 对数据处理的能力显然要比JS强大很多,对不熟悉JS的同学来说,phpQuery是个非常强大的帮手。如果了解了phpQuery,那么就很容易理解其 实phpQuery也可以取代一部分Smarty的功能。

我刚刚开始学习使用phpQuery,这应该算一篇学习笔记,我会努力将其向手册风格靠拢,不过不会做成中文手册,仍然会加入我在使用过程中遇到的问题以及解决方案。

开始phpQuery
参考资料:phpQuery JQuery

phpQuery从编程思想到语言风格都是参照JQuery来做的,所以熟悉JQuery的人可以随时对照参考JQuery手册,方便理解。

phpQuery应用举例:

require(’phpQuery/phpQuery.php’);
$file = file_get_contents(”test_phpQuery.html”);
$dom = phpQuery::newDocument($file);  //初始化对象

echo pq(”head > title”)->text(); //输出文档title

pq这个全局函数类似于JQuery中的$()符号,用于执行请求,或者遍历DOM节点。
例子中的”head > title”就是一个选择请求,选择head标签下的title子标签。

pq(”li”); //选择所有文档中的li标签
foreach(pq(”li”) as $item)
=======================================================================
这篇文章主要介绍了phpQuery让php处理html代码像jQuery一样方便,需要的朋友可以参考下

简介
如何在php中方便地解析html代码,估计是每个phper都会遇到的问题。用phpQuery就可以让php处理html代码像jQuery一样方便。
项目地址:https://code.google.com/p/phpquery/
github地址:https://github.com/TobiaszCudnik/phpquery
DEMO
下载库文件:https://code.google.com/p/phpquery/downloads/list
我下的是onefile版:phpQuery-0.9.5.386-onefile.zip
官方demo:https://code.google.com/p/phpquery/source/browse/branches/dev/demo.php
然后在项目中引用。
html文件test.html:


上面的代码中包含了取属性和innerText内容(通过nodeValue取)。
输出:

复制代码代码如下:

array (size=3)
  'name' =>
    array (size=2)
      0 => string 'Spiderman City Drive' (length=20)
      1 => string 'Spiderman - City Raid' (length=21)
  'href' =>
    array (size=2)
      0 => string 'http://www.gahe.com/Spiderman-City-Drive' (length=40)
      1 => string 'http://www.gahe.com/Spiderman-City-Raid' (length=39)
  'img' =>
    array (size=2)
      0 => string 'http://www.gahe.com/thumb/12/Spiderman-City-Drive.jpg' (length=53)
      1 => string 'http://www.gahe.com/thumb/12/Spiderman-City-Raid.jpg' (length=52)

强大的是pq选择器,语法类似jQuery,很方便。
来自:http://www.aspku.com/kaifa/php/46348.html

更多参考:
http://www.cnblogs.com/rmbteam/archive/2011/11/05/2236986.html
实践示例:http://querylist.cc/article/9



背景:调一个多进程程序,发现中间挂了,可我自己写的代码的父亲进程又拉起来了,无法调试到挂的原因,在当前目录下找不到coredump文件怎么办?修改Linux操作系统生成core dump文件的默认路径?最后,子进程死了父亲进程拉起,crack这块可能是return退出了,自己打印是crack,导致并不是真正的crack了,也就不是coredump了,特别注意这个问题。

gdb --core=core.9128
(gdb) file ./a.out

巡视:再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了, 如下:
[root@test log]# ulimit -a
core file size          (blocks, -c) 0
实践:没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。
$ ulimit -c 1024

$ ulimit -a
core file size (blocks, -c) 1024
ulimit -S -c unlimited > /dev/null 2>&1

[root@test multepoolserver]# ulimit -c 1024
[root@test multepoolserver]# ulimit -a
core file size          (blocks, -c) 1024
修改路径:
/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p
kernel.core_pattern = /var/log/%e.core.%p

————————————————————————————————————————————————————————————————
经过分析发现系统默认的core文件生成路径是/var/logs,但/var/logs目录并非系统自带的,系统初始安装默认自带的是/var/log,最终导致该系统出现core dump后并没能生成core文件,因此如何查询和修改系统默认的core dump文件生产路径呢?方法如下:
一. 查询core dump文件路径:
方法1:
# cat /proc/sys/kernel/core_pattern

方法2:
# /sbin/sysctl kernel.core_pattern

二. 修改core dump文件路径:
方法1:
临时修改:修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。
/proc/sys/kernel/core_pattern
例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern

方法2:
永久修改:使用sysctl -w name=value命令。
例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p为了更详尽的记录core dump当时的系统状态,可通过以下参数来丰富core文件的命名:
%% 单个%字符
摘自:http://m.blog.csdn.net/blog/bytxl/9786347
http://www.nginx.cn/1521.html



Linux CentOs6.2下下如何生成core dump文件及用GDB调试方法及设置
http://baidutech.blog.51cto.com/4114344/904419

在软件开发的过程中,无论如何努力,bug几乎都是必不可少的。当某些bug发生时,该进程会产生coredump文件。通过这个coredump文件,开发人员可以找到bug的原因。但是coredump的产生,大都是因为程序crash了。
1. 死锁
   有些bug是不会导致进程crash的,比如死锁——这时,程序已经不正常了,可是却没有coredump产生。如果环境又不允许gdb调试,难道我们就束手无策了吗?针对这种情况,一般情况下,对于这样的进程,可以利用watchdog监控它们,当发现这些进程很长时间没有更新其heartbeat时,可以给这些进程发送可以导致其产生coredump的信号。根据linux的信号默认的处理行为,SIGQUIT,SIGABRT, SIGFPE和SIGSEGV都可以让该进程产生coredump文件。这样我们可以通过coredump来得知死锁是否发生。当然,如果进程添加了这些信号的处理函数,那么就不会产生coredump了。
2.获取指定位置快照:
   还有一种情况,进程并没有死锁或者block在某个位置,但是我们需要在某个指定位置进行调试,获取某些变量或者其它信息。但是,有可能是客户环境或者生产环境,不允许我们进行长时间的检测。那么,我们就需要通过coredump来获得进程在运行到该点时的快照。
这个时候,可以利用gdb来产生手工产生coredump。在attach上这个进程时,在指定位置打上断点,当断点触发时,使用gdb的命令gcore,可以立即产生一个coredump。这样,我们就拿到了这个位置的进程快照。1. 欲查看多线程程序中所有线程的调用栈信息====================================
     gdb attach xxx
     set height 0
      thread apply all bt
      detach
      q
2. CPU占用率过高问题分析方法
====================================
shell下执行:ps -eLfP 找出cpu占用率高的线程
UID        PID  PPID   LWP PSR  C NLWP STIME TTY          TIME
root      1431  1270  1751   5 90   64 Dec24 ?        00:00:00
                      ^^^^  ^^ ^^
                    thread core cpurate
使用gdb:
gdb attach 1431        <==== 登录cpu占用率高的进程
set height 0
i thread               <==== 打印该进程的所有线程
找到 : LWP 1751 线程
17 Thread 855356656 (LWP 1751)  0x2ac30994 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
^^                   ^^^^^^^^
打出cpu占用率高的 任务的调用栈:
thread 17   <============  切换到该线�

Linux生成core文件、core文件路径设置:
——————————————————————————————————————————————————————————————
在Linux下产生并调试core文件 先看看我用的是个什么机器:

$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux

再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。


$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited

写个简单的程序,看看core文件是不是会被产生。

$ more foo.c

#include <stdio.h>

static void sub(void);

int main(void)
{
sub();
return 0;
}

static void sub(void)
{
int *p = NULL;

/* derefernce a null pointer, expect core dump. */
printf("%d", *p);
}

$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault

$ ls -l core.*
ls: core.*: No such file or directory

没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。

$ ulimit -c 1024

$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited

$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128

注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,9128是该进程的PID。我们用GDB来看看这个core。

$ gdb --core=core.9128
GNU gdb Asianux (6.0post-0.20040223.17.1AX)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-asianux-linux-gnu".
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048373 in ?? ()
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()

此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:

(gdb) file ./a.out
Reading symbols from ./a.out...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8

此时backtrace出来了。

(gdb) l
8 sub();
9 return 0;
10 }
11
12 static void sub(void)
13 {
14 int *p = NULL;
15
16 /* derefernce a null pointer, expect core dump. */
17 printf("%d", *p);
(gdb)

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。

1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。

2.core文件的名称和生成路径
----------------------------
core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名

3.core文件的查看
-----------------
core文件需要使用gdb来查看。
gdb ./a.out
core-file core.xxxx
使用bt命令即可看到程序出错的地方。
以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt

4.开发板上使用core文件调试
-----------------------------
如果开发板的操作系统也是linux,core调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的linux下。
在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都配置以上变量,即:在待运行gdb的路径下建立.gdbinit。
配置文件内容:
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
来自:http://www.nginx.cn/1521.html
日常应用中,我们经常会在php里面用到基于文件系统直接输出一个文件的方法,例如:阅读全文
想对Php代码作跳转,其实有一个叫openctags的插件生成一个openctags.tags的,可以用在Editplust里,跳转还不错。
我在Linux的生产环境下,执行:

如果是openctags则直接也可以在vim里命令行设定:

找到了 ctags 中文手册:
    使用 ctags 命令生成 tags 文件 (我生成了 VS 的整个 Solution)
    使用 vi 能够找到生成的 tags 文件(修改 _vimrc 文件,增加 set tags=文件完整路径,就可以找到生成的文件了)
    使用 CTRL + ] 或 CTRL + T 就可以跳转了(可以在方法间跳转,无法转到变量的定义处)
分页: 101/272 第一页 上页 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 下页 最后页 [ 显示模式: 摘要 | 列表 ]