GVKun编程网logo

addr2line的用法(addr2line如何使用)

19

在本文中,您将会了解到关于addr2line的用法的新资讯,同时我们还将为您解释addr2line如何使用的相关在本文中,我们将带你探索addr2line的用法的奥秘,分析addr2line如何使用的

在本文中,您将会了解到关于addr2line的用法的新资讯,同时我们还将为您解释addr2line如何使用的相关在本文中,我们将带你探索addr2line的用法的奥秘,分析addr2line如何使用的特点,并给出一些关于#define的用法、2019-01-25-read()、readline()和readlines()的用法区别、5、【Linux网络编程】socket中htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法、addEventListener 的用法示例介绍_javascript技巧的实用技巧。

本文目录一览:

addr2line的用法(addr2line如何使用)

addr2line的用法(addr2line如何使用)

到ndk找到addr2line,例如:

 /Users/yangjun/Library/Android/sdk/ndk/android-ndk-r9d/toolchains/x86-4.8/prebuilt/darwin-x86_64/bin/i686-linux-android-addr2line

然后执行:

./i686-linux-android-addr2line -f -C -e 带符号so的文件路径 地址

 

 

示例:

./i686-linux-android-addr2line -f -C -e /Users/yangjun/git/dingtalk/TBLiveStream-Android/artc-core/src/main/obj/local/armeabi-v7a/libTaoLive.so 0x33308

_jnienv::NewStringUTF(char const*)

/Users/liuyouxue/Library/Android/sdk/ndk/android-ndk-r9d/platforms/android-16/arch-arm/usr/include/jni.h:873

 

./i686-linux-android-addr2line -f -C -e /Users/yangjun/git/dingtalk/TBLiveStream-Android/artc-core/src/main/obj/local/armeabi-v7a/libTaoLive.so 0x476e4

TaoLivePublishEngine_Impl::onCsd(int, Buffer_Struct const&)

/Users/liuyouxue/work/android/dingding/c-bug/TBLiveStream-Android/artc-core/src/main/jni/LiveMediaFramework/fw/engine/TaoLivePublishEngine_Impl.cpp:856

 

./i686-linux-android-addr2line -f -C -e /Users/yangjun/git/dingtalk/TBLiveStream-Android/artc-core/src/main/obj/local/armeabi-v7a/libTaoLive.so 0x49cd8

FAACEncoder::configure(encode_param const&)

/Users/liuyouxue/work/android/dingding/c-bug/TBLiveStream-Android/artc-core/src/main/jni/LiveMediaFramework/fw/codec/FAACEncoder.cpp:82

 

 

 

#define的用法

#define的用法

语法:

  #define 标识符 被标识符代表的字符串 //这种用法很简单,就是一种替换.

语法:

  #define 标识符[(参数1,.....,参数n)] 被标识符代表的字符串 //其中,"被标识符代表的字符串"中出现的形参将在使用时被实参替代. 就像写函数一样.

  补充一点: 在用#define 定义时,可以用斜杠("/") 续行.vb中的下划线(" _")作用同.

  比如:

  #define add1( x,y ) ( x + y)

  也可以表示成 :

  #define add1(x,y) /

(x + y )

#define中的 ###

  在#define中,标准只定义了###两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。

  #include <stdio.h>

  #define paster( n ) printf( "token " #n" = %d/n ",token##n )

  int main()

  {

  int token9=10;

  paster(9);

  return 0;

  }

  输出为

  token 9 = 10

#define 的作用

  在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为。被定义为的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏代换宏展开。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。

  在C或C++语言中,分为有参数和无参数两种。

无参宏定义

无参宏的宏名后不带参数。

其定义的一般形式为: #define 标识符 字符串

其中的“#”表示这是一条预处理命令凡是以“#”开头的均为预处理命令

define为宏定义命令。标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。

  例如:

  #define M (a+b)

  它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时,所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。

  程序1

  #define M (a+b)

  main(){

  int s,y;

  printf("input a number: ");

  scanf("%d",&y);

  s=M*M;

  printf("s=%d/n",s);

  }

  上例程序中首先进行宏定义,定义M来替代表达式(a+b), s= M * M 中作了宏调用。在预处理时经宏展开后该语句变为: S=(a+b)*(a+b)

  但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。

  如当作以下定义后:#difine M (a)+(b)

  在宏展开时将得到下述语句:S= (a)+(b)*(a)+(b)

  对于宏定义还要说明以下几点:

  1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。

  2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。

  3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。

带参宏定义

  c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

  带参宏定义的一般形式为:

  #define 宏名(形参表) 字符串

在字符串中含有各个形参。

  带参宏调用的一般形式为:

  宏名(形参表)

  例如:

  #define M(y) ((y)*(y)+3*(y)) /*宏定义*/

  ....

  k=M(5); /*宏调用*/

  ....

  在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:

  k=5*5+3*5

  程序2

  #define MAX(a,b) (a>b)?a:b

  main(){

  int x,y,max;

  printf("input two numbers: ");

  scanf("%d%d",&x,&y);

  max=MAX(x,y);

  printf("max=%d/n",max);

  }

  上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式(a>b)?a:b,形参a,b均出现在条件表达式中。程序第七行max=MAX(x,y)为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为:

  max=(x>y)?x:y;

用于计算x,y中的大数。

  #define 条件编译

  头文件(.h)可以被头文件或C文件包含;

  重复包含(重复定义)

  由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。

  通过条件编译开关来避免重复包含(重复定义)

  例如

  #ifndef __headerfileXXX__

  #define __headerfileXXX__

  

  文件内容

  

  #endif

2019-01-25-read()、readline()和readlines()的用法区别

2019-01-25-read()、readline()和readlines()的用法区别

标签:python

需要提取的数据为:

i:I love seajay
from:AUTO
to:AUTO
smartresult:dict
client:fanyideskweb
salt:15483356026163
sign:0e6fc7b099ab52173b750e4f1fe2e967
ts:1548335602616
bv:563490a3a59c96d89a5868bde7ab81c1
doctype:json
version:2.1
keyfrom:fanyi.web
action:FY_BY_CLICKBUTTION
typoResult:false

将以上数据另存为“原始数据.txt”

1. read()的使用

>>> data = {}
    filename = "原始数据.txt"
>>> with open(filename) as f:
    print(f.read())

i:I love seajay
from:AUTO
to:AUTO
smartresult:dict
client:fanyideskweb
salt:15483356026163
sign:0e6fc7b099ab52173b750e4f1fe2e967
ts:1548335602616
bv:563490a3a59c96d89a5868bde7ab81c1
doctype:json
version:2.1
keyfrom:fanyi.web
action:FY_BY_CLICKBUTTION
typoResult:false

或者

>>> data = {}
    filename = "原始数据.txt"
>>> with open(filename) as f:
    print(f.read(80))

i:I love seajay
from:AUTO
to:AUTO
smartresult:dict
client:fanyideskweb
salt:1548

2. readline()的使用

>>> with open(filename) as f:
    line = f.readline().rstrip()
    while line:
        print(line)
        line = f.readline().rstrip()
        
i:I love seajay
from:AUTO
to:AUTO
smartresult:dict
client:fanyideskweb
salt:15483356026163
sign:0e6fc7b099ab52173b750e4f1fe2e967
ts:1548335602616
bv:563490a3a59c96d89a5868bde7ab81c1
doctype:json
version:2.1
keyfrom:fanyi.web
action:FY_BY_CLICKBUTTION
typoResult:false

注意:需要在末尾加上.strip(),否则输出会包含\n回车符

3. readlines()的使用

>>> data = {}
    filename = "原始数据.txt"
>>> with open(filename) as f:
    print(f.readlines())
    
[''i:I love seajay\n'', ''from:AUTO\n'', ''to:AUTO\n'', ''smartresult:dict\n'', ''client:fanyideskweb\n'', ''salt:15483356026163\n'', ''sign:0e6fc7b099ab52173b750e4f1fe2e967\n'', ''ts:1548335602616\n'', ''bv:563490a3a59c96d89a5868bde7ab81c1\n'', ''doctype:json\n'', ''version:2.1\n'', ''keyfrom:fanyi.web\n'', ''action:FY_BY_CLICKBUTTION\n'', ''typoResult:false'']

5、【Linux网络编程】socket中htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法

5、【Linux网络编程】socket中htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法

htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法

一、网络字节序和主机字节序

注:其中的h表示“host”,n表示“net”,l表示“long”,s表示“short”,a表示“ascii”,addr表示“in_addr结构体”

这些函数都与网络字节序和主机字节序列的转换,首先介绍一下网络字节序和主机字节序列及两者之间的转换关系。

网络字节顺序NBO(Network Byte Order):
      按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序(HBO,Host Byte Order):
      不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。 
      如 Intel x86结构下,short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12 。
      如IBM   power PC结构下,short型数0x1234表示为12   34, int型数0x12345678表示为12 34 56 78

以IP地址127.0.0.1为例,看看两者之间是如何转换的:

1 第一步   127   .   0    .   0    .   1                 把IP地址每一部分转换为8位的二进制数。
2 第二步 01111111.00000000.00000000.00000001 = 2130706433 (主机字节序)
3 然后把上面的四部分二进制数从右往左按部分重新排列,那就变为:
4 第三步 00000001.00000000.00000000.01111111 = 16777343 (网络字节序)

【示例】

1 SOCKADDR_IN addrSrv;
2 addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);
3 addrSrv.sin_family=AF_INET;
4 addrSrv.sin_port=htons(6000);

  先是定义了一个IP地址结构体addrSrv,然后初始化它的IP时addrSrv.sin_addr.S_un.S_addr必须是赋值IP地址的网络字节序,htonl函数的作用是把一个主机字节序转换为网络字节序,也就是上面转换过程中第二步转换为第三步的作用,127.0.0.1的主机字节序是2130706433,把主机字节序2130706433转换为网络字节序就是htonl(2130706433)=16777343,所以如果你知道网络字节序是16777343的话,addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);与addrSrv.sin_addr.S_un.S_addr=16777343;是完全一样的。

1 addrSrv.sin_addr.S_un.S_addr=htonl(2130706433);//这句还可以写为下面的样子
2 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 
3 //结果是完全一样的。
4 //可见inet_addr函数的转换作用就是上面的第一步到第三步的转换。

下面再看端口的主机字节序与网络字节序的转换。以6000端口为例。

1 第一步     00010111         01110000            =           6000 (主机字节序)
2 //端口号其实就已经是主机字节序了,首先要把端口号写为16位的二进制数,分前8位和后8位。
3 第二步      01110000          00010111          =            28695 (网络字节序)
4 //然后把主机字节序的前八位与后八位调换位置组成新的16位二进制数,这新的16位二进制数就是网络字节序的二进制表示了。

  因此,如果你知道6000端口的网络字节序是28695的话。 addrSrv.sin_port=htons(6000);可以直接写为 addrSrv.sin_port=28695;结果是一样的,htons的作用就是把端口号主机字节序转换为网络字节序。

二、htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法

htonl()函数:将主机字节序转换为网络字节序

  函数原型:

1 u_long PASCAL FAR htonl (u_long hostlong);

htons()函数:将主机字节序转换为网络字节序

  函数原型:

1 u_short PASCAL FAR htons (u_short hostshort);

ntohl()函数:网络顺序转换成主机顺序

  函数原型:

1 u_long PASCAL FAR ntohl (u_long netlong);

ntohs()函数:网络顺序转换成主机顺序

  函数原型:

1 u_short PASCAL FAR ntohs (u_short netshort);

inet_ntoa()函数:接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串。

  函数原型:

1 char FAR * PASCAL FAR inet_ntoa (struct in_addr in);

inet_addr()函数:需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。

          而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。

  函数原型:

1 unsigned long PASCAL FAR inet_addr (const char FAR * cp);

 

addEventListener 的用法示例介绍_javascript技巧

addEventListener 的用法示例介绍_javascript技巧

(要注意的是div必须放到js前面才行)

一般情况下,如果给一个dom对象绑定同一个事件,只有最后一个会生效,比如:

复制代码 代码如下:

document.getElementById("btn").onclick = method1;
document.getElementById("btn").onclick = method2;
document.getElementById("btn").onclick = method3;

那么将只有method3生效。

如果是Mozilla系列,用addEventListener可以让多个事件按顺序都实现,比如:
复制代码 代码如下:

var btn1Obj = document.getElementById("btn1");
//element.addEventListener(type,listener,useCapture);
btn1Obj.addEventListener("click",method1,false);
btn1Obj.addEventListener("click",method2,false);
btn1Obj.addEventListener("click",method3,false);

执行顺序为method1->method2->method3

如果是ie系列,用attachEvent可以让多个事件按顺序都实现,比如:
复制代码 代码如下:

var btn1Obj = document.getElementById("btn1");
//object.attachEvent(event,function);
btn1Obj.attachEvent("onclick",method1);
btn1Obj.attachEvent("onclick",method2);
btn1Obj.attachEvent("onclick",method3);

执行顺序为method3->method2->method1

=======================================================

Mozilla中:

addEventListener的使用方式

target.addEventListener(type,listener,useCapture);

target: 文档节点、document、window 或 XMLHttpRequest。
type: 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
listener :实现了 EventListener 接口或者是 JavaScript 中的函数。
useCapture :是否使用捕捉,一般用 false 。例如:document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);

IE中:

target.attachEvent(type, listener);
target: 文档节点、document、window 或 XMLHttpRequest。
type: 字符串,事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。
listener :实现了 EventListener 接口或者是 JavaScript 中的函数。 例如:document.getElementById("txt").attachEvent("onclick",function(event){alert(event.keyCode);});

W3C 及 IE 同时支持移除指定的事件, 用途是移除设定的事件, 格式分别如下:

removeEventListener(event,function,capture/bubble);

Windows IE的格式如下:

detachEvent(event,function);

DOM2 的进化:
DOM 0 Event DOM 2 Event
onblur() blur
onfocus() focus
onchange() change
onmouseover() mouseover
onmouseout() mouseout
onmousemove() mousemove
onmousedown() mousedown
onmouseup() mouseup
onclick() click
ondblclick() dblclick
onkeydown() keydown
onkeyup() keyup
onkeypress() keypress
onsubmit() submit
onload() load
onunload() unload


新的DOM2 用法可以addEventListener()这个函数来观察到:
复制代码 代码如下:

addEventListener(event,function,capture/bubble);

参数event如上表所示, function是要执行的函数, capture与bubble分别是W3C制定得两种时间模式,简单来说capture就是从document的开始读到最后一行, 再执行事件, 而bubble则是先寻找指定的位置再执行事件.
capture/bubble的参数是布尔值, True表示用capture, False则是bubble.Windows Internet Explorer也有制定一种EventHandler, 是 attachEvent(), 格式如下:
复制代码 代码如下:

window.attachEvent(”submit”,myFunction());

比较特别的是attachEvent不需要指定capture/bubble的参数, 因为在windows IE环境下都是使用Bubble的模式.

如何判断是否支持哪种监听呢?如:
复制代码 代码如下:

if (typeof window.addEventListener != “undefined”) {
window.addEventListener(”load”,rollover,false);
} else {
window.attachEvent(”onload”,rollover)
}

上述的 typeof window.addEventListener != “undefined” 程序代码可以判断使用者的浏览器是否支持AddEventListener这个事件模型, 如果不支持就使用attachEvent.

W3C 及 IE 同时支持移除指定的事件, 用途是移除设定的事件, 格式分别如下:

W3C格式:

removeEventListener(event,function,capture/bubble);

Windows IE的格式如下:

detachEvent(event,function);

关于addr2line的用法addr2line如何使用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于#define的用法、2019-01-25-read()、readline()和readlines()的用法区别、5、【Linux网络编程】socket中htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的用法、addEventListener 的用法示例介绍_javascript技巧等相关知识的信息别忘了在本站进行查找喔。

本文标签: