xml version="1.0" encoding="utf-8" standalone="yes"12bet++博客-Prayerhttp://www.fometaux.com/prayer/在一般中寻求卓越zh-cnMon, 24 Jun 2019 22:10:12 GMTMon, 24 Jun 2019 22:10:12 GMT6012bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/06/24/216446.htmlPrayerPrayerMon, 24 Jun 2019 02:09:00 GMThttp://www.fometaux.com/prayer/archive/2019/06/24/216446.htmlhttp://www.fometaux.com/prayer/comments/216446.htmlhttp://www.fometaux.com/prayer/archive/2019/06/24/216446.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216446.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216446.htmlhttps://blog.csdn.net/liujinwei2005/article/details/8547190

DB2 缓冲池调优Bufferpools


背景知识
缓冲池是内存中的一块存储区域,用于临时读入和更改数据库页(包含表行或索引项)。缓冲池的用途是为了提高数据库系统的性能。从内存访问数据要比从磁盘访问数据快得多。因此,数据库管理器需要从磁盘读取或写入磁盘的次数越少,性能就越好。对一个或多个缓冲池进行配置之所以是调优的最重要方面,是因为连接至数据库的应用程序的大多数数据(不包括大对象和长字段数据)操作都在缓冲池中进行。
缺省情况下,应用程序使用缓冲池 IBMDEFAULTBP,它是在创建数据库时创建的。当 SYSCAT.BUFFERPOOLS 目录表中该缓冲池的 NPAGES 值为 -1 时,DB2 数据库配置参数 BUFFPAGE 控制着缓冲池的大小。否则会忽略 BUFFPAGE 参数,并且用 NPAGES 参数所指定的页数创建缓冲池。
建议
对于仅使用一个缓冲池的应用程序,将 NPAGES 更改成 -1,这样 BUFFPAGE 就可以控制该缓冲池的大小。这使得更新和报告缓冲池大小以及其它 DB2 数据库配置参数变得更加方便。
确保可以使用数据库配置中的 BUFFPAGE 参数来控制缓冲池大小之后,将该参数设置成合适的值。根据数据库的大小和应用程序的性质将该参数设置成一个合理的大值,这种做法很安全。通常,该参数的缺省值非常小,可能满足不了要求。请考虑下列情况:
一开始,如果您的机器上有足够大的内存,请将 BUFFPAGE 设置成 40000 个页(160 MB),或者等于机器总内存的 10%。 
对于大型 OLTP 数据库,在保持系统稳定的同时为缓冲池留出尽可能多的内存。一开始,先尝试使用 1.6 GB 的内存,然后尝试用更多内存。 
如何更改该参数
运行下面这个脚本,以便: 
验证目录值 
启用数据库配置参数 BUFFPAGE 
更新所有数据库的 BUFFPAGE 值。 
db2 -v connect to DB_NAME
db2 -v select * from syscat.bufferpools
db2 -v alter bufferpool IBMDEFAULTBP size -1
db2 -v connect reset
db2 -v update db cfg for dbname using BUFFPAGE bigger_value
db2 -v terminate
研究步骤
要确定数据库的缓冲池大小是否由 BUFFPAGE 参数所决定,请运行:
db2 -v connect to DB_NAME
db2 -v SELECT * from SYSCAT.BUFFERPOOLS
db2 -v connect reset
db2 -v terminate
检查结果。如果每个缓冲池都有一个为“-1”的 NPAGES 值,那么缓冲池大小是由数据库配置中的 BUFFPAGE 参数控制的。
要确定缓冲池大小是否足够大,请在运行应用程序时收集数据库和/或缓冲池的快照。类似于下面的脚本为您提供这些所需的信息:
db2 -v update monitor switches using bufferpool on
db2 -v get monitor switches
db2 -v reset monitor all
-- run your application --
db2 -v get snapshot for all databases > snap.out
db2 -v get snapshot for dbm >> snap.out
db2 -v get snapshot for all bufferpools >> snap.out
db2 -v reset monitor all
db2 -v terminate
请确保您在断开数据库连接之前发出“db2 -v get snapshot”。当最后一个应用程序与数据库断开连接时,该数据库停止运行,同时所有快照统计信息将会丢失。要确保一直存在使数据库处于正常运行状态的连接,请使用下列方法之一:
在收集快照的窗口中保持一个单独的连接。 
使用 DB2 ACTIVATE DATABASE 命令。
在数据库快照或缓冲池快照的快照输出中,查找下列“logical reads”和“physical reads”,这样就可以计算出缓冲池命中率,它可以帮助您调优缓冲池:
-- Related lines from a sample of bufferpool snapshots --
Buffer pool data logical reads = 702033
Buffer pool data physical reads = 0
Buffer pool data writes = 414
Buffer pool index logical reads = 168255
Buffer pool index physical reads = 0
缓冲池命中率表明数据库管理器不需要从磁盘装入页(即该页已经在缓冲池中)就能处理页请求的时间百分比。缓冲池的命中率越高,使用磁盘 I/O 的频率就越低。按如下计算缓冲池命中率:
(1 - ((buffer pool data physical reads + buffer pool index physical reads) /
(buffer pool data logical reads + pool index logical reads))
) * 100%
这个计算考虑了缓冲池高速缓存的所有页(索引和数据)。理想情况下,该比率应当超过 95%,并尽可能接近 100%。要提高缓冲池命中率,请尝试下面这些方法:
增加缓冲池大小。 
考虑分配多个缓冲池,如果可能的话,为每个经常被访问的大表所属的表空间分配一个缓冲池,为一组小表分配一个缓冲池,然后尝试一下使用不同大小的缓冲池以查看哪种组合会提供最佳性能。 
如果已分配的内存不能帮助提高性能,那么请避免给缓冲池分配过多的内存。应当根据取自测试环境的快照信息来决定缓冲池的大小。

缓冲池命中率

这个比率说明了为页面请求提供服务时,数据库管理器不需从磁盘装入页(即该页已经在缓冲池中)就能处理页请求的时间百分比。

计算:

BPHR = (1 - ((缓冲池数据物理读 + 缓冲池索引物理读) /

(缓冲池数据逻辑读 + 缓冲池索引逻辑读) ) ) * 100%

索引命中率

这个比率表明了可以在缓冲池中找到的页面能够满足的对索引页的所有读请求所占的百分比。

计算:

IHR = (1 - (缓冲池索引物理读 / 缓冲池索引逻辑读) ) ) * 100%

数据命中率

这个比率说明了可以在缓冲池中找到的页面能够满足的对数据页的所有读请求所占的百分比。

计算:

DHR = (1 - (缓冲池数据物理读 / 缓冲池数据逻辑读) ) ) * 100%

结论

缓冲池命中率大于 80% 被认为是理想的。对于 OLTP 系统来说,该值的理想情况是尽可能接近于 100% (索引命中率更是如此)。

要提高缓冲池的命中率,可以增加缓冲池的大小,也可以考虑分配多个缓冲池,可以为每个经常访问的具有自己的表空间的大型表使用一个缓冲池,也可以为一组小型表使用一个缓冲池。



Bwin平台 2019-06-24 10:09 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/06/03/216394.htmlPrayerPrayerMon, 03 Jun 2019 10:20:00 GMThttp://www.fometaux.com/prayer/archive/2019/06/03/216394.htmlhttp://www.fometaux.com/prayer/comments/216394.htmlhttp://www.fometaux.com/prayer/archive/2019/06/03/216394.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216394.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216394.htmlhttps://blog.csdn.net/haifeilang/article/details/54959450
每次下载最新的UltraEdit,默认主题是黑色,很不适应,想更改主题又常常找不到在哪里,
最新Ultraedit设置主题和老版本不太一样,所以网上经验没太大帮助。
记录到12bet怎么样,以备不时之需:
Ultraedit -->布局(Layout)-->主题(Themes)
      
选择自己喜欢的主题吧!
--------------------- 
作者:haifeilang 
来源:CSDN 
原文:https://blog.csdn.net/haifeilang/article/details/54959450 
版权声明:本文为博主原创文章,转载请附上博文链接!


Bwin平台 2019-06-03 18:20 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/10/216346.htmlPrayerPrayerWed, 10 Apr 2019 06:28:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/10/216346.htmlhttp://www.fometaux.com/prayer/comments/216346.htmlhttp://www.fometaux.com/prayer/archive/2019/04/10/216346.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216346.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216346.htmlnm命令介绍的很多,但大多不介绍其函数符号标志的含义。
最近在调试动态库时常用到,其中用的最多的用法:
nm -A * |grep “aaa” | 12betfilt  // -A 为了显示文件, 12betfilt转换为可读风格,好像有个参数也能实现类似功能


其他内容整理如下(原作者未知):

nm用于列出目标文件的符号清单,如果没有指定目标文件,则默认为“a.out”。nm的格式如下:

nm [‘-a’|‘--debug-syms’] [‘-g’|‘--extern-only’]
         [‘-B’] [‘-C’|‘--demangle’[=style]] [‘-D’|‘--dynamic’]
         [‘-S’|‘--print-size’] [‘-s’|‘--print-armap’]
         [‘-A’|‘-o’|‘--print-file-name’][‘--special-syms’]
         [‘-n’|‘-v’|‘--numeric-sort’] [‘-p’|‘--no-sort’]
         [‘-r’|‘--reverse-sort’] [‘--size-sort’] [‘-u’|‘--undefined-only’]
         [‘-t’ radix|‘--radix=’radix] [‘-P’|‘--portability’]
         [‘--target=’bfdname] [‘-f’format|‘--format=’format]
         [‘--defined-only’] [‘-l’|‘--line-numbers’] [‘--no-demangle’]
        [‘-V’|‘--version’] [‘-X 32_64’] [‘--help’] [objfile...]
  
对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。
如下例:
  
     00000024 T cleanup_before_linux
     00000018 T cpu_init
     00000060 T dcache_disable
     00000054 T dcache_enable
     0000006c T dcache_status
     00000000 T do_reset
     0000003c T icache_disable
     00000030 T icache_enable
     00000048 T icache_status
 
上面的显示是使用nm cpu.o的输出,对于cleanup_before_linux这个符号来说,00000024是以16进制显示的其值,T为其类型,而cleanup_before_linux是其名字。可以看出,上面显示的cleanup_before_linux这个symbol的值实际上是该函数在text section中的偏移。但是,每个符号的值的具体含义依其类型而异。当然,对于每个符号的值,其类型、其值以及它们所属的section是密切相关的。
下面说明符号类型:对于每一个符号来说,其类型如果是小写的,则表明该符号是local的;大写则表明该符号是global(external)的。

符号
类型
说明
A该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。
B该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中定义全局static int test。则该符号test的类型为b,位于bss section中。其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM
C该符号为commoncommon symbol是未初始话数据段。该符号没有包含于一个普通section中。只有在链接过程中才进行分配。符号的值表示该符号需要的字节数。例如在一个c文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C。否则其类型为B
D该符号位于初始话数据段中。一般来说,分配到data section中。例如定义全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},则会分配于初始化数据段中
G该符号也位于初始化数据段中。主要用于small object提高访问small data object的一种方式。
I该符号是对另一个符号的间接引用。
N该符号是一个debugging符号。
R该符号位于只读数据区。例如定义全局const int test[] = {123, 123};test就是一个只读数据区的符号。注意在cygwin下如果使用gcc直接编译成MZ格式时,源文件中的test对应_test,并且其符号类型为D,即初始化数据段中。但是如果使用m6812-elf-gcc这样的交叉编译工具,源文件中的test对应目标文件的test,即没有添加下划线,并且其符号类型为R。一般而言,位于rodata section。值得注意的是,如果在一个函数中定义const char *test = “abc”, const char test_int = 3。使用nm都不会得到符号信息,但是字符串“abc”分配于只读存储器中,testrodata section中,大小为4
S符号位于非初始化数据区,用于small object
T该符号位于代码区text section
U该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U
V该符号是一个weak object
WThe symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-该符号是a.out格式文件中的stabs symbol
该符号类型没有定义


Bwin平台 2019-04-10 14:28 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/04/216337.htmlPrayerPrayerThu, 04 Apr 2019 09:49:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/04/216337.htmlhttp://www.fometaux.com/prayer/comments/216337.htmlhttp://www.fometaux.com/prayer/archive/2019/04/04/216337.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216337.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216337.htmlhttps://www.cnblogs.com/ev-zhk/p/4277023.html
[root@www ~]# sed [-nefr] [动作] 选项与参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。  动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 1020 行之间进行的,则『 10,20[动作行为] 』  function: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
复制代码


sed -i 就是直接对文本文件进行操作的

sed -i 's/原字符串/新字符串/' /home/1.txt sed -i 's/原字符串/新字符串/g' /home/1.txt


这两条命令的区别就是,看示例吧

这是1.txt的内容

#cat 1.txt d ddd #ff

再看执行这两条命令的区别吧

复制代码
sed -i 's/d/7523/' /home/1.txt 执行结果 7523 7523dd #ff  sed -i 's/d/7523/g' /home/1.txt 执行结果 7523 752375237523 #ff
复制代码

 

去掉 “行首” 带“@”的首字母@

sed -i 's/^@//' file

 

特定字符串的行前插入新行

sed -i '/特定字符串/i 新行字符串' file

 

特定字符串的行后插入新行

sed -i '/特定字符串/a 新行字符串' file

 

特定字符串的删除

sed -i '/字符串/d' file

 



Bwin平台 2019-04-04 17:49 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/04/216336.htmlPrayerPrayerThu, 04 Apr 2019 09:46:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/04/216336.htmlhttp://www.fometaux.com/prayer/comments/216336.htmlhttp://www.fometaux.com/prayer/archive/2019/04/04/216336.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216336.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216336.htmlhttps://blog.csdn.net/halazi100/article/details/41722021

在使用sed对日志或者其它文本进行parse的过程当中,有时候我们需要引用外部变量的值,
 
或者获取一个shell命令执行的结果,以便达到更加可观的输出结果。这里介绍如何做到。
 
sed中使用变量替换
 
1.sed命令使用双引号的情况下,使用$var直接引用
 
$ echo|sed "s/^/$RANDOM.rmvb_/g"
 29328.rmvb_

如果替换的变量内容中含有/符号则会提示如下错误,如
查找当前目录下的目录文件并将相对路径替换为绝对路径
find . -type f | sed -n "s/\./$PWD/p"
sed: -e expression #1, char 19: unknown option to `s'
从语法上看,没有任何问题;但由于变量中包含有“/”作为分隔符,这会和sed的替换操作的分隔符“/”引起混淆;所以,只要不使用“/”做分隔符就可以解决这个问题,如果使用“%”而不是“/”来作为sed的替换操作的分隔符,就不会出错。其实使用#或%或;作为分隔符也是可以的,只要不会与替换中有相同的而且不是元字符的特殊符号都是可以的;使用时可以根据情况灵活选择。
find . -type f | sed -n "s%\.%$PWD%p"
find . -type f | sed -n "s#\.#$PWD#p"

# 上面例子引用了一个环境变量$RANDOM的值
 
2.sed命令使用单引号的情况下,使用'"$var"'引用
 
类似,我们可以看到
 
$ echo|sed 's/^/'"$RANDOM"'.rmvb_/g'
 31338.rmvb_
 
sed中执行外部命令
 
1.sed命令使用单引号的情况下使用'`shell command`'或者'$(shell command)'引用命令执行的结果
 
还是以上面案例分析,例子如下
 
$ echo|sed 's/^/'`echo $RANDOM`'.rmvb_/g'
 8063.rmvb_
 

# 上面的例子使用了旧式的命令替换,也可以采用新式的命令替换方法,如下
 
$ echo|sed 's/^/'$(echo $RANDOM)'.rmvb_/g'
 18554.rmvb_
 

# 下面例子取用当前日期作为结果的一部分,如下
 
$ echo|sed 's/^/'$(date +"%Y%m%d")'.rmvb_/g'
 20120108.rmvb_
 

2.sed命令使用双引号的情况下直接`shell command`或者$(shell command)引用命令执行的结果
 

类似的,双引号的情况,如下
 
$ echo|sed "s/^/$(date +"%Y%m%d").rmvb_/g"
 20120108.rmvb_
 

# 使用环境变量$RANDOM以及旧式命令替换的例子
 
$ echo|sed "s/^/`echo $RANDOM`.rmvb_/g"
 4988.rmvb_
 
总结
 
在sed语句里面,变量替换或者执行shell命令,双引号比单引号少绕一些弯子



Bwin平台 2019-04-04 17:46 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/04/216335.htmlPrayerPrayerThu, 04 Apr 2019 09:46:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/04/216335.htmlhttp://www.fometaux.com/prayer/comments/216335.htmlhttp://www.fometaux.com/prayer/archive/2019/04/04/216335.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216335.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216335.html比较文件夹diff,可以直接使用diff命令

[root@~]# diff -urNa dir1 dir2
  -a Treat all files as text and compare them line-by-line, even if they do not seem to be text.
  -N, --new-file
    In directory comparison, if a file is found in only one directory, treat it as present but empty in the other directory.
  -r When comparing directories, recursively compare any subdirectories found.

  -u Use the unified output format.

 

比较文件夹diff,也可以比较文件MD5列表。下面命令可以获取文件夹中文件md5列表

find /home/ -type f -not \( -name '.*' \) -exec md5sum {} \;

说明:(1) /home/文件目录

     (2) -type f 文件类型为普通文件

     (3) -not \( -name '.*' \)  过滤掉隐藏文件。可以过滤掉不需要考虑的文件

         (4) -exec md5sum {} \;  对每个文件执行md5sum命令 

 

 用tar命令压缩后,比较文件的MD5是不行的。tar压缩会带上文件的时间



Bwin平台 2019-04-04 17:46 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/04/216334.htmlPrayerPrayerThu, 04 Apr 2019 09:13:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/04/216334.htmlhttp://www.fometaux.com/prayer/comments/216334.htmlhttp://www.fometaux.com/prayer/archive/2019/04/04/216334.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216334.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216334.htmlhttps://www.jianshu.com/p/66f79ad53406

如果知道行号可以用下面的方法

sed -i '88 r b.file' a.file    #在a.txt的第88行插入文件b.txt awk '1;NR==88{system("cat b.file")}' a.file > a.file 

如果不知道行号,可以用正則匹配

sed -i '/regex/ r b.txt' a.txt # regex是正则表达式 awk '/target/{system("cat b.file")}' a.file > c.file 

sed的話如果不改变源文件,可以去掉-i开关,修改会输出到STDOUT

原文件:

[root@xiaowu shell]# cat -n file       1  aaaa      2  bbbb      3  cccc      4  dddd 

现在要在第二行即“bbbb”行的下面添加一行,内容为“xiaowu”

[root@xiaowu shell]# sed '/bbbb/a\xiaowu' file  aaaa bbbb xiaowu cccc dddd 

如果要加两行“xiaowu”可以用一下语句,注意用“\n”换行

[root@xiaowu shell]# sed '/bbbb/a\xiaowu\nxiaowu' file  aaaa bbbb xiaowu xiaowu cccc dddd 

如果要在第二行即“bbbb”行的上添加一行,内容为“xiaowu”,可以把参数“a”换成“i”

[root@xiaowu shell]# sed '/b/i\xiaowu' file  aaaa xiaowu bbbb cccc dddd 

以上文件中只有一行匹配,如果文件中有两行或者多行匹配,结果有是如何呢?

[root@xiaowu shell]# cat -n file       1  aaaa      2  bbbb      3  cccc      4  bbbb      5  dddd 
[root@xiaowu shell]# sed '/bbbb/a\xiaowu' file  aaaa bbbb xiaowu cccc bbbb xiaowu dddd 

由结果可知,每个匹配行的下一行都会被添加“xiaowu”

那么如果指向在第二个“bbbb”的下一行添加内容“xiaowu”,该如何操作呢?
可以考虑先获取第二个“bbbb”行的行号,然后根据行号在此行的下一行添加“xiaowu”

获取第二个“bbbb”行的行号的方法:
方法一:

[root@xiaowu shell]# cat -n file |grep b |awk '{print $1}'|sed -n "2"p 4 

方法二:

[root@xiaowu shell]# sed -n '/bbbb/=' file |sed -n "2"p 4 

由结果可知第二个“bbbb”行的行号为4,然后再在第四行的前或后添加相应的内容:

[root@xiaowu shell]# sed -e '4a\xiaowu' file  aaaa bbbb cccc bbbb xiaowu dddd 
[root@xiaowu shell]# sed -e '4a\xiaowu\nxiaowu' file  aaaa bbbb cccc bbbb xiaowu xiaowu dddd 

向指定行的末尾添加指定内容,比如在“ccccc”行的行尾介绍“ eeeee”

[root@xiaowu shell]# cat file aaaaa bbbbb ccccc ddddd [root@xiaowu shell]# sed 's/cc.*/& eeeee/g' file aaaaa bbbbb ccccc eeeee ddddd 

原文链接



Bwin平台 2019-04-04 17:13 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/04/216333.htmlPrayerPrayerThu, 04 Apr 2019 02:15:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/04/216333.htmlhttp://www.fometaux.com/prayer/comments/216333.htmlhttp://www.fometaux.com/prayer/archive/2019/04/04/216333.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216333.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216333.html在rhel6.6上安装qt后,运行qtcreator提示 “核心载入失败: /opt/Qt5.3.2/Tools/QtCreator/lib/qtcreator/plugins/libCore.so: 无法加载库/opt/Qt5.3.2/Tools/QtCreator/lib/qtcreator/plugins/libCore.so:(/usr/lib64/libstd12bet.so.6: version `GLIBCXX_3.4.14' not found (required by /opt/Qt5.3.2/Tools/QtCreator/lib/qtcreator/plugins/libCore.so))

在网上查找资料后,解决方法如下

 

1.查看gcc版本中包含哪些库。

strings /usr/lib64/libstd12bet.so.6 | grep GLIBC

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  可以看出不包含GLIBCXX_3.4.14

2.从网上下载高版本的libstd12bet.so.6.0.13以上的版本,比如libstd12bet.so.6.0.17。

3.把libstd12bet.so.6.0.17拷贝到/usr/lib64目录下。

  cp libstd12bet.so.6.0.17 /usr/lib64/

4.删除libstd12bet.so.6符号连接。

  rm libstd12bet.so.6

5.新建里符号连接。

  ln -s libstd12bet.so.6.0.17 libstd12bet.so.6

6.再次查看就没有问题了。

 

libstd12bet.so.6.0.17下载地址



Bwin平台 2019-04-04 10:15 发表评论
]]>
12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/04/216332.htmlPrayerPrayerThu, 04 Apr 2019 02:14:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/04/216332.htmlhttp://www.fometaux.com/prayer/comments/216332.htmlhttp://www.fometaux.com/prayer/archive/2019/04/04/216332.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216332.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216332.html
  • /lib 
    最基本的共享库和内核模块。 
    目的 -> 存放用于启动系统和执行root文件系统的命令的如/bin /sbin的二进制文件的共享库,或者存放32位,或者64位(file命令查看)。
  • /lib、 /usr/lib、/usr/local/lib 
    目的 -> 就是为了区分32位和64位而设置的目录。这种情况下/lib有可能是其符号链接。
  • /usr/lib、/usr/local/lib 
    程序和安装包的库路径。 
    说明 -> 不依赖特定架构的库应该放到/usr/share中而不是这里。应用程序可以自己创建一个单独的子目录并把自己的库放在其中。

  • 总结 
    一般情况下: 
    系统自己会匹配应用程序与其应该调用的位数的库。 
    如果是用于/bin /sbin的库,放置到/lib*之中。 
    如果是用于用户程序或安装包的,放置到/usr/lib*或/usr/local/lib*之中。 
    如果某个库只是特别的用了某个专用程序,而这个程序但并不打算直接被用户或者root调用,应放置到/usr/libexec中。

  • http://unix.stackexchange.com/questions/74646/difference-between-lib-lib32-lib64-libx32-and-libexec



    Bwin平台 2019-04-04 10:14 发表评论
    ]]>
    12bet++博客-Prayerhttp://www.fometaux.com/prayer/archive/2019/04/03/216328.htmlPrayerPrayerWed, 03 Apr 2019 07:56:00 GMThttp://www.fometaux.com/prayer/archive/2019/04/03/216328.htmlhttp://www.fometaux.com/prayer/comments/216328.htmlhttp://www.fometaux.com/prayer/archive/2019/04/03/216328.html#Feedback0http://www.fometaux.com/prayer/comments/commentRss/216328.htmlhttp://www.fometaux.com/prayer/services/trackbacks/216328.html

    本文要介绍的ldd和nm是linux下,两个用来分析程序很实用的工具。ldd是用来分析程序运行时需要依赖的动态库的工具;nm是用来查看指定程序中的符号表相关内容的工具。下面通过例子,分别来介绍一下这两个工具:

    1. ldd, 先看下面的例子, 用ldd查看cs程序所依赖的动态库:

    1. $ ldd cs  
    2. linux-gate.so.1 =>  (0xffffe000)  
    3. libz.so.1 => /lib/libz.so.1 (0xb7f8c000)  
    4. libpthread.so.0 => /lib/libpthread.so.0 (0xb7f75000)  
    5. libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0xb7e4d000)  
    6. libpcre.so.0 => /usr/lib/libpcre.so.0 (0xb7e21000)  
    7. libstd12bet.so.6 => /usr/local/gcc4.5.1/lib/libstd12bet.so.6 (0xb7d40000)  
    8. libm.so.6 => /lib/libm.so.6 (0xb7d18000)  
    9. libgcc_s.so.1 => /usr/local/gcc4.5.1/lib/libgcc_s.so.1 (0xb7cfd000)  
    10. libc.so.6 => /lib/libc.so.6 (0xb7bbc000)  
    11. /lib/ld-linux.so.2 (0xb7fab000)  
    12. libdl.so.2 => /lib/libdl.so.2 (0xb7bb7000)  

    在上面的例子中,ldd的结果可以分为三列来看:

    •第一列:程序需要依赖什么库
    •第二列: 系统提供的与程序需要的库所对应的库
    •第三列:库加载的开始地址
    通过上面的信息,我们可以得到以下几个信息:

    •(1) 通过对比第一列和第二列,我们可以分析程序需要依赖的库和系统实际提供的,是否相匹配
    •(2) 通过观察第三列,我们可以知道在当前的库中的符号在对应的进程的地址空间中的开始位置
    2. nm, 通过下面的例子,我们来介绍nm工具:

    先看一下这个简单的程序:

    1. #include "iostream"   
    2.    
    3. using namespace std;  
    4.    
    5. class Test  
    6. {  
    7. public:  
    8.     void Hello()  
    9.     {  
    10.         cout < < "Hello world!" << endl;  
    11.     }  
    12. };  
    13.    
    14. int main()  
    15. {  
    16.     Test test;  
    17.     test.Hello();  
    18. }  

    接下来,我们编译该程序,然后看nm的结果:

    1. $ g++ test.cc -o test  
    2. c$ nm test  
    3. 08049f10 d _DYNAMIC  
    4. 08049ff4 d _GLOBAL_OFFSET_TABLE_  
    5. 080486f0 t _GLOBAL__I_main  
    6. 080487fc R _IO_stdin_used  
    7.          w _Jv_RegisterClasses  
    8. 080486b0 t _Z41__static_initialization_and_destruction_0ii  
    9. 0804870c W _ZN4Test5HelloEv  
    10.          U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4  
    11.          U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4  
    12.          U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4  
    13. 0804a040 B _ZSt4cout@@GLIBCXX_3.4  
    14.          U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4  
    15. 0804a0d4 b _ZStL8__ioinit  
    16.          U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4  
    17. 08049f00 d __CTOR_END__  
    18. 08049ef8 d __CTOR_LIST__  
    19. 08049f08 D __DTOR_END__  
    20. 08049f04 d __DTOR_LIST__  
    21. 080488c8 r __FRAME_END__  
    22. 08049f0c d __JCR_END__  
    23. 08049f0c d __JCR_LIST__  
    24. 0804a02c A __bss_start  
    25.          U __cxa_atexit@@GLIBC_2.1.3  
    26. 0804a024 D __data_start  
    27. 080487b0 t __do_global_ctors_aux  
    28. 08048610 t __do_global_dtors_aux  
    29. 0804a028 D __dso_handle  
    30.          w __gmon_start__  
    31.          U __gxx_personality_v0@@CXXABI_1.3  
    32. 080487aa T __i686.get_pc_thunk.bx  
    33. 08049ef8 d __init_array_end  
    34. 08049ef8 d __init_array_start  
    35. 08048740 T __libc_csu_fini  
    36. 08048750 T __libc_csu_init  
    37.          U __libc_start_main@@GLIBC_2.0  
    38. 0804a02c A _edata  
    39. 0804a0d8 A _end  
    40. 080487dc T _fini  
    41. 080487f8 R _fp_hw  
    42. 08048508 T _init  
    43. 080485e0 T _start  
    44. 0804a0cc b completed.7065  
    45. 0804a024 W data_start  
    46. 0804a0d0 b dtor_idx.7067  
    47. 08048670 t frame_dummy  
    48. 08048694 T main  

    上面便是test这个程序中所有的符号,首先需要介绍一下上面的内容的格式:

    •第一列:当前符号的地址
    •第二列:当前符号的类型
    •第三列:当前符号的名称
    在上面的结果中,像_ZN4Test5HelloEv这样的符号,很多读者朋友可能会被它搞晕,这里介绍个小技巧,在nm的时候,加上-C选项,就可以把这些难以识别的符号,转换成便于我们阅读的符号TestHello()。这个主要是12bet中的mangle机制所导致的,加上-C就是指定列出的符号是demangle了的。说了这么多,到底nm对我们程序有啥具体的帮助呢,我觉得主要有以下几个方面:
    (1)判断指定程序中有没有定义指定的符号 (比较常用的方式:nm -C proc | grep symbol)
    (2)解决程序编译时undefined reference的错误,以及mutiple definition的错误

    (3)查看某个符号的地址,以及在进程空间的大概位置(bss, data, text区,具体可以通过第二列的类型来判断)

    本文要介绍的ldd和nm是linux下,两个用来分析程序很实用的工具。ldd是用来分析程序运行时需要依赖的动态库的工具;nm是用来查看指定程序中的符号表相关内容的工具。下面通过例子,分别来介绍一

    相关推荐



    Bwin平台 2019-04-03 15:56 发表评论
    ]]>