Linux生成core文件、core文件路径设置

2012年1月27日 没有评论

在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

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

分类: c++ 标签:

httpclient连接超时设置

2012年1月27日 没有评论

/* 从连接池中取连接的超时时间 */
ConnManagerParams.setTimeout(params, 1000);
/* 连接超时 */
HttpConnectionParams.setConnectionTimeout(params, 2000);
/* 请求超时 */
HttpConnectionParams.setSoTimeout(params, 4000);

第一行设置ConnectionPoolTimeout:这定义了从ConnectionManager管理的连接池中取出连接的超时时间,此处设置为1秒。
第二行设置ConnectionTimeout:这定义了通过网络与服务器建立连接的超时时间。Httpclient包中通过一个异步线程去创建与服务器的socket连接,这就是该socket连接的超时时间,此处设置为2秒。
第三行设置SocketTimeout:这定义了Socket读数据的超时时间,即从服务器获取响应数据需要等待的时间,此处设置为4秒。
以上3种超时分别会抛出ConnectionPoolTimeoutException,ConnectionTimeoutException与SocketTimeoutException。

 

httpclient post方法封装

public static String post(String url, NameValuePair... params) {
try {
// 编码参数
List<NameValuePair> formparams = new ArrayList<NameValuePair>(); // 请求参数
for (NameValuePair p : params) {
formparams.add(p);
}
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams,
CHARSET);
// 创建POST请求
HttpPost request = new HttpPost(url);
request.setEntity(entity);
// 发送请求
HttpClient client = getHttpClient();
HttpResponse response = client.execute(request);
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new RuntimeException("请求失败");
}
HttpEntity resEntity =  response.getEntity();
return (resEntity == null) ? null : EntityUtils.toString(resEntity, CHARSET);
} catch (UnsupportedEncodingException e) {
Log.w(TAG, e.getMessage());
return null;
} catch (ClientProtocolException e) {
Log.w(TAG, e.getMessage());
return null;
} catch (IOException e) {
throw new RuntimeException("连接失败", e);
}

}

分类: andoird, java 标签: ,

java.net.SocketException: No route to host

2012年1月27日 没有评论

网络环境不好,连不上网络异常,把手机放到信号好的地方就能解决。

分类: andoird 标签:

编译zxing核心包过程

2012年1月27日 没有评论

先安装ant,然后下载代码,按如下步骤编译即可

分类: andoird 标签:

php过滤html标签函数

2012年1月24日 没有评论

strip_tags(),能过滤标准的html标签,只留下html中的内容,去掉标签元素。

分类: 杂谈 标签:

PHP数组适用unset删除重建索引

2012年1月24日 没有评论

1.unset删除元素后不会重建数组的索引。

array_values()可以实现索引重建
阅读全文...

分类: PHP 标签:

resources.ap_资源文件不存在错误

2012年1月1日 没有评论

Compile Error: Error generating final archive: java.io.FileNotFoundException: ..\bin\resources.ap_ does not exist.

对工程的包名重构后出现这个错误。

 

解决办法:

Project > Clean

重新生成工程即可。

分类: andoird 标签: ,

Android R.java文件丢失后重新生成

2012年1月1日 没有评论

方法1:右击工程->选择Android Tools->选择Fix Project Properties 。

方法 2:  右击你的工程(项目)——>Properties——>Android ——> 选择相应的target 然后 点击 apply 即可。

这样就应该OK!如若不行,向下看!

 

主要看工程中带红色“X”号的地方,主要检查布局文件xml,如果这里面有错误,就不会重新生成了,

先排除这里的错误,然后进行方法1或方法2即可。

分类: andoird 标签: , ,

google c/c++编程风格总结

2011年12月27日 没有评论

先阐述几个概念:

  Pascal Case :当标识符由两个或者两个以上单词组成的时候,单词之间不加其他的符号,并且每个单词首字母都必须大写,例如PascalCase。

  camel Case: 当标识符由两个或者两个以上单词组成的时候,单词间不加其他的符号,并且第一个单词以小写开头,其他单词以大写开头。例如camelCase。

  Unix/Linux变量命名方法:当程序由两个或两个以上单词组成的时候,单词都以小写开头,并且以_连接。 

  下面是Google C++编程规范的一些内容:

  一、命名

    1)普通变量:linux命名规范 。例如:string table_name;

    2)常量: k+PascalCase。例如 const int kDayInAWeek = 7;

    3)类私有成员: linux命名规范+_。 例如:int parament_count_;

    4)普通函数命名:PascalCase。例如:AddTableEntry()。

    5)存储函数:linux命名方法。例如:

       int num_entries() const {return num_entries_};

       void set_num_entries(){int num_entries};

    6)枚举:值为全大写组成的单词,单词以_分割。例如MY_ENUM_VALUE

    7)类名、结构名:PascalCase

  二、函数参数

    输入参数在钱,输出参数在后。

  三、头文件排序

    C系统头文件

    C++系统头文件

    其他库头文件

    本项目内头文件

  四、文件注释

    1、创建时间  作者

    2、修改时间  修改人   修改函数列表

    3、头文件中,首先生命该类的作用,对函数的用法作简单说明

  五、其他约定

    1、每行不要超过80个字符,包含长路径或者头文件保护的情况除外;

    2、设定编辑器将tab转换为空格,最好为4个空格;

    3、空循环体使用{}、continue,而不是一个分号;

    4、不要使用匈牙利命名法。

分类: c++ 标签:

快递公司快递单号规律总结

2011年12月27日 没有评论

申通单号由12位数字组成,常见以268**、368**、58**等开头

EMS单号由13位字母和数字组成,开头和结尾二位是字母,中间是数字

顺丰单号由12位数字组成,常见以电话区号后三位开头

圆通单号由10位字母数字组成,常见以1*、2*、6*、8*、D*及V*等开头

中通单号由12位数字组成,常见以2008**、6**、010等开头

韵达单号由13位数字组成,常见以10*、12*、19*等开头

天天单号由14位数字组成,常见以6**、5*、00*等开头

汇通快递查询单号由13位数字编码组成,常见以0*或者B*、H*开头

速尔的快递单号由12位数字组成的

德邦的货运单号现在是以1或2开头的8位数字组成

宅急送单号由10位数字组成,常见以7**、6**、5**等开头

分类: 网站 标签:
普人特福的博客cnzz&51la for wordpress,cnzz for wordpress,51la for wordpress