当前位置:首页 » 编程软件 » 编译抓取

编译抓取

发布时间: 2022-07-27 15:09:39

① 如何实现工业机器人编程抓取

机器人编程语言详解

计算机视觉程序员会给出不同于认知机器人的答案。每个人都不同意什么是“最好的编程语言”,语言首先学习,即使这是最现实的答案,因为它取决于您要开发的应用程序类型以及您正在使用的系统。

机器人十大流行编程语言

世界上有超过1500种编程语言,这是目前机器人技术中十种最流行的编程语言。每种语言对机器人有不同的优势:

10.BASIC/帕斯卡

BASIC和Pascal,它们是几种工业机器人语言的基础,如下所述。BASIC是为初学者设计的(它代表初学者通用符号指令代码),这使它成为一个非常简单的语言开始。帕斯卡尔旨在鼓励良好的编程习惯小号,并介绍构造,如指针,它一个很好的“敲门砖”,从普通版使一个更复杂的语言。这几天,这两种语言都有点过时,有利于“日常使用”。但是,如果要进行大量的低级编码,或者想要熟悉其他工业机器人语言,可以学习它们。

9.工业机器人语言

几乎每个机器人制造商都开发了自己的专有机器人编程语言。您可以通过学习Pascal熟悉其中的几个。但是,您每次开始使用新的机器人时,仍然需要学习新的语言。

ABB拥有RAPID编程语言。Kuka有KRL(Kuka Robot Language)。Comau使用PDL2,安川使用INFORM和川崎使用AS。然后,Fanuc机器人使用Karel,Stäubli机器人使用VAL3和Universal Robots使用URScript。

近年来,像ROS Instrial这样的编程选项开始为程序员提供更多的标准化选项。但是,如果您是技术人员,则您更有可能使用制造商的语言。

8.LISP

LISP是世界上第二大最古老的编程语言(FORTRAN年龄较大,但只有一年)。它不像这个列表上许多其他编程语言那么广泛使用;然而,在人工智能编程中仍然非常重要。ROS的一部分是用LISP编写的,尽管你不需要知道使用ROS。

7.硬件描述语言(HDL)

硬件描述语言基本上是描述电子设备的编程方式。这些语言对于一些机器人专家来说是相当熟悉的,因为它们用于编程现场可编程门阵列(FPGA)。FPGA允许您开发电子硬件,而无需实际生产硅芯片,这使得它们成为更快更容易的一些开发选择。

如果你不是电子原型,你可能永远不会使用HDL。即使如此,重要的是知道它们存在,因为它们与其他编程语言完全不同。一方面,所有操作都是并行执行的,而不是依照基于处理器的语言进行。

6.装配

大会允许您以“一级和零级”进行编程,这是最低级别(或多或少)的编程,最近大多数低级别的电子设备都需要编程,随着Arino等的兴起微控制器,您现在可以使用C / C ++轻松地在这个级别进行编程,这意味着大部分机器人可能不那么必要。

5.MATLAB

MATLAB及其开放源码的亲戚,如Octave,是非常受欢迎的一些机器人工程师分析数据和开发控制系统。还有一个非常受欢迎的机器人工具箱用于MATLAB。我知道使用MATLAB开发整个机器人系统的人。如果要分析数据,生成高级图形或实现控制系统,您可能需要学习MATLAB。

4.C#/.NET

C#是Microsoft提供的专有编程语言。我在这里包括C#/ .NET,主要是因为使用它作为主要语言的Microsoft Robotics Developer Studio。如果你要使用这个系统,你可能要使用C#。但是,首先学习C / C ++可能是长期发展编码技巧的好选择。

3.java

一些计算机科学学位将Java教学作为他们的第一种编程语言。Java从程序员“隐藏”底层的内存功能,这使得它比C更容易编程,但这也意味着你对代码实际做的不太了解。如果您从计算机科学的背景(许多人,特别是在研究中)来到机器人,你可能已经学会了Java。像C#和MATLAB一样,Java是一种解释语言,这意味着它不会被编译成机器代码。相反,Java虚拟机在运行时解释指令。使用Java的理论是,由于Java虚拟机,您可以在许多不同的机器上使用相同的代码。在实践中,这并不总是奏效,有时会导致代码运行缓慢。然而,Java在机器人的某些部分非常受欢迎,因此你可能需要它。

2.python

Python近年来尤其在机器人技术方面出现了巨大的复苏。其中一个原因可能是Python(和C ++)是ROS中发现的两种主要的编程语言。像Java一样,它是一种解释语言。与Java不同,语言的主要重点是易用性。许多人都认为这样做非常好。

Python节省了许多常规的事情,这些事情在编程中花费时间,例如定义和转换变量类型。此外,还有大量免费的图书馆,这意味着当您需要实现一些基本功能时,您不必“重新发明”。并且由于它允许使用C / C ++代码进行简单的绑定,这意味着代码的性能很重的部分可以用这些语言来实现,以避免性能下降。

1.C / C ++

最后,我们达到机器人技术的第一编程语言!许多人都同意C和C ++是新机器人的好起点。为什么?因为很多硬件库都使用这些语言。它们允许与低级硬件进行交互,允许实时性能和非常成熟的编程语言。这些天,您可能会使用C ++多于C,因为该语言具有更多的功能。C ++基本上是C的扩展。首先学习至少一点C可能是有用的,以便您可以在找到以C编写的硬件库时识别它。C / C ++并不像以前那样简单,比如Python或者MATLAB。使用C实现相同的功能可能需要相当长的时间,并且需要更多的代码行。然而,由于机器人非常依赖于实时性能,

机器人的主要特点之一是其通用性,是机器人具有可编程能力是实现这一特点的重要手段。机器人编程必然涉及机器人语言。机器人语言是使用符号来描述机器人动作的方法,它通过对机器人的描述,使机器人按照编程者的意图进行各种操作。

机器人语言的产生和发展是与机器人技术的发展以及计算机编程语言的发展紧密相关的。编程系统的核心问题是操作运动控制问题。

机器人编程系统以及方法

机器人编程是机器人运动和控制问题的结合点,也是机器人系统最关键的问题之一。当前实用的工业机器人常为离线编程或示教,在调试阶段可以通过示教控制盒对编译好的程序一步一步地进行,调试成功后可投入正式运行。

机器人语言操作系统包括3个基本的操作状态:

  • 监控状态

  • 编程状态

  • 执行状态

  • 监控状态:用来进行整个系统的监督控制。

    编辑状态:提供操作者编制程序或编辑程序

    执行状态:用来执行机器人程序

    把机器人源程序转换成机器码,以便机器人控制柜能直接读取和执行,编译后的程序运行速度将大大加快。

    根据机器人不同的工作要求,需要不同的编程。编程能力和编程方式有很大的关系,编程方式决定着机器人的适应性和作业能力。随着计算机在工业上的广泛应用,工业机器人的计算机编程变得日益重要。

    编程语言也是多种多样的,目前工业机器人的编程方式有以下几种:

  • 顺序控制的编程

    在顺序控制的机器中,所有的控制都是由机械或者电气的顺序控制来实现,一般没有程序设计的要求。顺序控制的灵活性小,这是因为所有的工作过程都已编辑好,由机械挡块,或其他确定的办法所控制。大量的自动机都是在顺序控制下操作的,这种方法的主要优点是成本低、易于控制和操作。

  • 示教方式编程

    目前,大多数工业机器人都具有采用示教方式来编程的功能。示教方式编程一般可分为手把手示教编程和示教盒示教编程两种方式:

  • 手把手示教编程:主要用于喷漆、弧焊等要求实现连续轨迹控制的工业机器人示教编程中。具体的方法是利用示教手柄引导末端执行器经过所要求的位置,同时由传感器检测出工业机器人个关节处的坐标值,并由控制系统记录、存储下这些数据信息。实际工作中,工业机器人的控制系统会重复再现示教过的轨迹和操作技能。

    手把手示教编程也能实现点位控制,与CP控制不同的是它只记录个轨迹程序移动的两端点位置,轨迹的运动速度则按各轨迹程序段应对的功能数据输入。

  • 示教盒示教编程方式是人工利用示教盒上所具有的各种功能的按钮来驱动工业机器人的各关节轴,按作业所需要的顺序单轴运动或多关节协调运动,完成位置和功能的示教编程。示教盒示教一般用于大型机器人或危险条件作业下的机器人示教。

  • 脱机编程或预编程

  • 脱机编程和预编程的含义相同,它是指用机器人程序语言预先用示教的方法编程,脱机编程的优点:

  • 编程可以不使用机器人,可以腾出机器人去做其他工作

  • 可预先优化操作方案和运行周期

  • 以前完成的过程或子程序可结合到代编的程序中去

  • 可以用传感器探测外部信息,从而使机器人做出相应的响应。这种响应使机器人可以在自适应的方式下工作

  • 控制功能中,可以包含现有的计算机辅助设计(CAD)和计算机辅助制造(CAM)的信息

  • 可以用预先运行程序来模拟实际运动,从而不会出现危险,以在屏幕上模拟机器人运动来辅助编程

  • 对不同的工作目的,只需替换一部分待定的程序

  • 在非自适应系统中,没有外界环境的反馈,仅有的输入是关节传感器的测量值,从而可以使用简单的程序设计手段。

  • 对机器人的编程要求

  • 能够建立世界模型

  • 能够描述机器人的作业

  • 能够描述机器人的运动

  • 允许用户规定执行流程

  • 有良好的编辑环境

  • 机器人编辑语言的类型

  • 动作级

    (AL语言系统、LUNA语言及其特征)

  • 对象级

    (AUTOPASS语言及其特征、RAPT语言及其特征)

  • 任务级

② java怎样爬取jsp文件

不可能,只能抓取被浏览器编译后的html页面!

③ 如何用Python抓取动态页面信息

很早之前,学习Python web编程的时候,就涉及一个Python的urllib。可以用urllib.urlopen("url").read()可以轻松读取页面上面的静态信息。但是,随着时代的发展,也来越多的网页中更多的使用javascript、jQuery、PHP等语言动态生成页面信息。因此,用urllib再去抓取页面HTML就不足以达到我们想要的效果。
回到顶部
解决思路:

有一个思路最为简单的思路可以动态解析页面信息。urllib不可以解析动态信息,但是浏览器可以。在浏览器上展现处理的信息其实是处理好的HTML文档。这为我们抓取动态页面信息提供了很好的思路。在Python中有一个很有名的图形库——PyQt。PyQt虽然是图形库,但是他里面 QtWebkit。这个很实用。谷歌的Chrome和苹果的Safari都是基于WebKit内核开发的,所以我们可以通过PyQt中得QtWebKit 把页面中的信息读取加载到HTML文档中,再解析HTML文档,从HTML文档中提取我们想用得信息。
回到顶部
所需材料:
作者本人实用Mac OS X。应该在Windows和linux平台也可以采用相同的办法。
1、Qt4 library
Library,而不是Creator。Library在Mac的默认安装路径下,应该是/home/username/Developor/,不要改变Qt4的默认安装路径。否则可能安装失败。
官方网址:http://qt-project.org/downloads

2、SIP、PyQt4
这两个软件可以在在PyQt的官网找到。下载的是它的源码。Mac和Linux需要自己编译。
下载地址是:http://www.riverbankcomputing.co.uk/software/pyqt/download
在终端切换到文件解压后的目录中。
在终端中输入
python configure.py
make
sudo make install
进行安装编译。
SIP和PyQt4两个安装方法相同。但是PyQt4依赖SIP。所以先安装SIP再安装PyQt4

1、2两步完成之后,Python的PyQt4的模块就安装好了。在Python shell中输入import PyQt4看看能不能找到PyQt4的模块。

3、Spynner
spynner是一个QtWebKit的客户端,它可以模拟浏览器,完成加载页面、引发事件、填写表单等操作。
这个模块可以在Python的官网找到。
下载地址: https://pypi.python.org/pypi/spynner/2.5
解压后,cd到安装目录,然后输入sudo python configure.py install安装该模块。
这样Spynner模块就安装完成了,在python shell中试试import spynner看看该模块有没有安装完成。

回到顶部
Spynner的简单使用
Spynner的功能十分强大,但是由于本人能力有限,就介绍一下如何显示网页的源码吧。
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#! /usr/bin/python
#-*-coding: utf-8 -*-

import spynner

browser = spynner.Browser()
#创建一个浏览器对象

browser.hide()
#打开浏览器,并隐藏。

browser.load("http://www..com")
#browser 类中有一个类方法load,可以用webkit加载你想加载的页面信息。
#load(是你想要加载的网址的字符串形式)

print browser.html.encode("utf-8")
#browser 类中有一个成员是html,是页面进过处理后的源码的字符串.
#将其转码为UTF-8编码

open("Test.html", 'w+').write(browser.html.encode("utf-8"))
#你也可以将它写到文件中,用浏览器打开。

browser.close()
#关闭该浏览器


通过这个程序,就可以比较容易的显示webkit处理的页面HTML源码了。

④ libpcap怎么在android编译

运行主界面,点击菜单

菜单界面,点击开始抓包,然后切换出去,用浏览器上网,再切换回来

上图是抓到的包,显示在界面上

主要思路
1 使用库libpcap,写个简单的c程序main.c,实现抓包,在控制台输出所抓取包的内容,可以先在linux用gcc编译,以root权限运行一次,确保程序正确

2 用ndk编译main.c,得到可执行文件pcap(名字自己取的),放到/system/bin下,修改权限,用手机连接电脑,用adb shell以root权限 试一下,确保程序正确

3 在Android程序中以root权限执行pcap,并获得输出的数据
4 将输出的数据解析成Packet(jpcap中的一个类)类的对象
5 然后在Java中,你就可以做你想做的了

⑤ 如何抓取Silverlight中的数据

1、在浏览器中,打开Silverlight页面,点击右键,查看页面源代码;
2. 在html源代码中搜索"xap",很快就能定位出xap的位置。例如:<param name="Source" value="test/getdata.xap" />
该value就是xap在服务器端的位置。
3.把它和网址域名地址拼接起来,来获取当前的xap文件。在地址栏输入: .moumou.com/test/getdata.xap,
这时浏览器会提示你下载该xap文件
4.重新命名下载下来的文件getdata.xap,为 getdata.zip. 然后解压该压缩包到同一个目录. 在目录中,会看到该Silverlight使用的文件.

5.使用大Reflector来查看反编译DLL中文件即可

⑥ 如何手工抓取mp文件

在生产环境下进行故障诊断时,为了不终止正在运行的服务或应用程序,有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试。
首先一种比较直观简洁的方式就是用WinDbg等调试器直接attach到需要调试的进程,调试完毕之后再detach即可。但是这种方式有个缺点就是执行debugger命令时必须先break这个进程,执行完debug命令之后又得赶紧F5让他继续运行,因为被你break住的时候意味着整个进程也已经被你挂起。另外也经常会由于First Chance Excetpion而自动break,你得时刻留意避免长时间break整个进程。所以这样的调试方式对时间是个很大的考验,往往没有充裕的时间来做仔细分析。
另一种方式则是在出现问题的时候,比如CPU持续长时间100%,内存突然暴涨等非正常情况下,通过对服务进程snapshot抓取一个mp文件,完成mp之后先deatch,让进程继续运行。然后用windbg等工具来分析这个抓取到的mp文件。
那么如何在不终止进程的情况下抓取mp文件呢?Debugging Tools for Windows里提供了一个非常好的工具,adplus.vbs。从名字可以看出,实际上是一个vb脚本,只是对cdb调试器作的一个包装脚本。
其路径与Debugging Tools for Windows的安装路径相同,使用的方法也很简单,如下所示:
adplus.vbs -hang -p 1234 -o d:/mp
其中-hang指明使用hang模式,亦即在进程运行过程中附加上去snapshot抓取一个mp文件,完成之后detach。与之对应的是-crash崩溃模式,用户先启动adplus,然后由它启动要监控的程序,在出现异常崩溃时自动生成mp文件,或者通过Ctrl-C人为发出抓取指令。但是-crash模式在抓取完成之后,被监控的进程就必须终止。因此我们在这里只选用-hang模式。
-p是要调试的进程ID,比如ASP.NET应用线程池,在Win2003下就是w3wp.exe
-o 指定要output的mp文件路径。
另外,与adplus类似的,有个UserDump工具,但是抓取用户模式的进程,而adplus则是内核模式和用户模式两者皆可。
而总所周至的Dr. Waston,则会在进程崩溃之后的自动时候抓取mp文件,一样可以用于windbg等调试器来事后分析程序崩溃时的状态。
====================
0:000> !mpheap -stat
No export mpheap found
======解决方法:
.load clr20/sos.dll,你要先执行的。sos.dll在默认的c:/windows/microsoft.net/framework/v2.....下面,你复制到c:/program files/debugging tools for windows下面的clr20目录下面(clr20是你手工创建的)
=======================

在.NET下开发时,最基本的调试方法就是使用Visual Studio的单步调试。但是对于一些特殊情况,特别是涉及到CLR内部的时候使用这种方式就达不到目的了。
如果要查看运行时内存使用情况,IL代码,CLR信息等可以使用以下两种方式:
1、使用VS2005 + sos.dll
2、使用Windbg + sos.dll
第二种方式功能更加强大,下面我就通过实际操作展示一下怎么使用这种方法得到运行时ArrayList内部的值。
有人可能会说:我直接用Visual Studio的单步调试岂不是更快?当然,这个只是一个演示,通过这个演示是为以后的高级调试打下基础

在操作之前,先熟悉一下基本知识:
A、使用VS2005 + sos.dll调试
1、需要在项目->属性->调试-〉启用非托管代码调试
2、打开调试-〉窗口-〉即时
3、在即时窗口中输入 !load sos 加载调试模块
4、输入其它调试语句

B、使用Windbg + sos.dll
1、去微软的网站下载最新的Windbg
2、打开Windbg在File-〉Symbol File Path ...窗口中输入 srv*c:/symbols*http://msdl.microsoft.com/download/symbols
3、运行需要调试的程序,然后在Windbg中File-〉Attach to Process中选择刚才运行的程序
4、在出现的Command窗口中就可以输入调试语句
5、常用调试语句:
lm //查看加载了哪些模块
.load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/sos.dll //加载调试模块
ld TestClass //加载调试符号
!name2ee TestClass.exe TestClass.Program.test //显示test方法相关的地址
!mpmt -md 00976d48 //得到类的成员函数详细信息
!mpil 00973028 // 显示这个方法被编译器编译之后的IL代码
!mpheap -stat //该命令显示程序中所有对象的统计信息,显示的大小是对象本身的大小,不包括对象里面值的大小
!mpheap -mt 790fcb30 //该命令显示MethodTable 790fcb30的详细信息
!gcroot 012919b8 //来显示一个实例的所属关系
!mpobj(do) 012a3904 //显示一个对象的具体内容,看对象里面有什么,值是什么
!ObjSize 012a1ba4 //对象实际在内存中的大小
!eeheap -gc //查看托管堆的情况(包括大小)
!DumpArray //查看数组信息
下面就来看看具体的调试步骤:
1、我们的测试代码

namespace TestClass
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add("aaaa");
list.Add("bbbb");
Console.ReadLine();
}
}
}很简单,就是一个ArrayList

运行这个程序(开始执行,不调试),然后进入Windbg,Attach到这个进程

2、查看所有堆栈信息
0:004> !mpheap -stat
MT Count TotalSize Class Name
7910062c 1 12 System.Security.Permissions.SecurityPermission
7918e284 1 16 System.IO.TextReader+SyncTextReader
79102d10 1 20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
79102cb4 1 20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
79101d30 1 20 System.Text.
79100a7c 1 20 Microsoft.Win32.SafeHandles.SafeFileHandle
79105cd4 1 24 System.Collections.ArrayList
......
7912ad90 11 9036 System.Object[]
790fcb30 2083 131492 System.String
Total 2202 objects
除了我们的ArrayList外,还有很多其它的系统信息,先不用管它

3、查看我们的ArrayList的信息
0:004> !mpheap -mt 79105cd4
Address MT Size
012a1b88 79105cd4 24
total 1 objects
Statistics:
MT Count TotalSize Class Name
79105cd4 1 24 System.Collections.ArrayList
Total 1 objects

4、查看对应地址内部实际的值
0:004> !do 012a1b88
Name: System.Collections.ArrayList
MethodTable: 79105cd4
EEClass: 79105c28
Size: 24(0x18) bytes
(C:/WINDOWS/assembly/GAC_32/mscorlib/2.0.0.0__b77a5c561934e089/mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
7912ad90 40008df 4 System.Object[] 0 instance 012a1bb0 _items
791018e0 40008e0 c System.Int32 1 instance 2 _size
791018e0 40008e1 10 System.Int32 1 instance 2 _version
790fc35c 40008e2 8 System.Object 0 instance 00000000 _syncRoot
7912ad90 40008e3 1c0 System.Object[] 0 shared static emptyArray
>> Domain:Value 00149c58:012a1ba0 <<
可以看到ArrayList的大小为2,具体的值保存在地址012a1bb0中,是一个System.Object[]类型的数组

5、查看数组信息
0:004> !DumpArray 012a1bb0
Name: System.Object[]
MethodTable: 7912ad90
EEClass: 7912b304
Size: 32(0x20) bytes
Array: Rank 1, Number of elements 4, Type CLASS
Element Methodtable: 790fc35c
[0] 012a1b50
[1] 012a1b6c
[2] null
[3] null

6、查看数组内对象的值
0:004> !do 012a1b50
Name: System.String
MethodTable: 790fcb30
EEClass: 790fca90
Size: 26(0x1a) bytes
(C:/WINDOWS/assembly/GAC_32/mscorlib/2.0.0.0__b77a5c561934e089/mscorlib.dll)
String: aaaa
Fields:
MT Field Offset Type VT Attr Value Name
791018e0 4000096 4 System.Int32 1 instance 5 m_arrayLength
791018e0 4000097 8 System.Int32 1 instance 4 m_stringLength
790fe534 4000098 c System.Char 1 instance 61 m_firstChar
790fcb30 4000099 10 System.String 0 shared static Empty
>> Domain:Value 00149c58:790d81bc <<
7912b1d8 400009a 14 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 00149c58:012a16f0 <<
====================
windbg使用小总结
【抓mp】
1、一般抓法
adplus -hang -p 3230 -quiet 抓3230 pid进程,hang模式,相当于把那个进程暂停住,取内存快照
adplus -crash -pn w3wp -quiet 抓w3wp进程,crash模式,当那个进程崩溃结束的时候自动抓取当时的内存
adplus -hang -iis -quiet 抓IIS相关进程,包括其上host的web应用,以及iis自身
2、抓window服务
http://support.microsoft.com/kb/824344/zh-cn
3、远程抓
http://blog.joycode.com/tingwang/archive/2006/08/11/79763.aspx
4、抓蓝屏和死机的mp
电脑无故重启或者蓝屏会在C:/WINDOWS/Minimp/下保存一个minimp,但是这个minimp可用的命令很少,一般只打!analyze –v看到是哪个进程引起的,还有相关的驱动模块就基本定位问题了。
5、IIS回收的时候抓
http://blog.yesky.com/blog/omakey/archive/2006/12/17/1618015.html
6、计划任务抓
比如一个进程起来后不知道它什么时候会意外崩溃,可以在计划任务里用crash里抓,当那个进程意外终止的时候,cdb可以直接附加上去,抓取当时的mp,如果要抓一些会自动重启的进程,而且要抓每次重启前的mp,可以参考附录里一节。
【常用命令】
1、先path C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727,把.net路径设置为path环境变量,一遍在windbg里可以直接.load sos,而不必.load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/sos.dll
2、ld demo,加载你程序的pdb文件,调试.net程序一般要把kernel32和mscorwks的符号加载上,关于这两个东西大家可以查资料,尤其是后者有哪些函数可以多了解一些。
3、在windbg的file/symbol file path对话框里输入以下文字,以便自动加载和下载符号
C:/WINDOWS/Symbols;d:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/symbols;.sympath SRV*d:/localsymbols*http://msdl.microsoft.com/download/symbols
其中有windows、.net2.0和自动从网上下载的调试符号,注意根据自己的情况适当修改目录
【调试死锁】
1、!syncblk,查看哪些线程拿到了锁
2、~67e!clrstack 跳到某个拿到锁的线程看它正在干什么操作,迟迟不肯释放锁
3、!runaway 查看这个占有锁的线程运行了多长时间。
4、~*e!clrstack查看所有线程的托管堆栈,看看哪些是正在等待锁的,比如hang在System.Threading.Monitor.Enter(System.Object)
5、~136s选择该线程,显示如下
0:000> ~136s eax=00005763 ebx=08deeb5c ecx=03eff0d4 edx=5570ab69 esi=08deeb5c edi=7ffd6000 eip=7c95ed54 esp=08deeb10 ebp=08deebb8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c95ed54 c3 ret
找到ecx寄存器的值,复制后ctrl+f,向上查找,会找到!syncblk的地方,如下
0:000> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 1906 03ee4be4 5 1 03ee8f88 22c8 67 185e2ef0 System.Object 5390 052ca39c 3 1 05292b30 1dd4 49 1060d3ac System.Object 9372 0530702c 15 1 0012d3a8 1aa8 80 185e7704 System.Object 11428 03eff0d4 35 1 053b8fa8 169c 120 166acd98 System.Object 15278 0531c6b4 61 1 06bc1430 26d8 86 1a5bea88 System.Object
可以看到136线程等待的锁被120号线程占着不放(格式有点乱,凑合看),
6、有时候通过ecx寄存器找锁不是很确定,可以用~* kb来把所有线程堆栈打出来,然后根据!syncblk出来的同步快的值去搜索大概有多少个线程在等那个锁。因为同样是等待锁,可等的状态不一样,有的在Q里,有的锁已经升级,有的去尝试去拿锁了,所以不一定当时ecx寄存器指向那块内存,具体如何找到某个正在等待锁的线程等待的锁的内存地址,以及它正等待的这个锁被哪个线程拿着,我还没琢磨出规律来,但一般情况下,如果有其它同步对象的话,更难查。.net里用我上面说的几步就能查出锁的问题了。

【内存泄漏】
1、!mpheap -stat看看哪些对象个数最多,占内存最大,
2、找到某个格式比较多的对象,可以看它的方法表,然后用!mpheap -mt 66398fa4去随机找几个对象的地址
3、用!do 1e5a22bc命令去查看几个对象的状态,属性的值等,看看正常不正常
4、用!gcroot -nostacks 1e5a22bc去查看几个对象的根正常不正常,如果有些对象的根不是自己预先设计的那样,很可能被自己没想到的对象强引用了,所以GC无法回收它,就泄漏了。
【CPU百分百】
主要用几个计数器和!runaway命令,具体见以下链接
http://www.cnblogs.com/onlytianc ... 7/06/03/769307.html
【线程池耗尽】
!threadpool 能看到完成端口,线程池工作线程和timer回调各占线程池的情况。
【其它】
1、!eestack -short -ee查看所有重要(获取锁的,托管的,停止并允许回收的)线程的mpstack,差不多相当于~*e!mpstack
2、.time 可以看到进程跑了多少时间
3、!dso 查看当前线程里有哪些对象,分析内存泄漏问题也许会用到

⑦ 如何用python 爬虫抓取金融数据

获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之路。

本篇使用的版本为python3.5,意在抓取证券之星上当天所有A股数据。程序主要分为三个部分:网页源码的获取、所需内容的提取、所得结果的整理。

一、网页源码的获取

很多人喜欢用python爬虫的原因之一就是它容易上手。只需以下几行代码既可抓取大部分网页的源码。

为了减少干扰,我先用正则表达式从整个页面源码中匹配出以上的主体部分,然后从主体部分中匹配出每只股票的信息。代码如下。

pattern=re.compile('<tbody[sS]*</tbody>')
body=re.findall(pattern,str(content)) #匹配<tbody和</tbody>之间的所有代码pattern=re.compile('>(.*?)<')
stock_page=re.findall(pattern,body[0]) #匹配>和<之间的所有信息

其中compile方法为编译匹配模式,findall方法用此匹配模式去匹配出所需信息,并以列表的方式返回。正则表达式的语法还挺多的,下面我只罗列所用到符号的含义。

语法 说明

. 匹配任意除换行符“ ”外的字符

* 匹配前一个字符0次或无限次

? 匹配前一个字符0次或一次

s 空白字符:[<空格> fv]

S 非空白字符:[^s]

[...] 字符集,对应的位置可以是字符集中任意字符

(...) 被括起来的表达式将作为分组,里面一般为我们所需提取的内容

正则表达式的语法挺多的,也许有大牛只要一句正则表达式就可提取我想提取的内容。在提取股票主体部分代码时发现有人用xpath表达式提取显得更简洁一些,看来页面解析也有很长的一段路要走。

三、所得结果的整理

通过非贪婪模式(.*?)匹配>和<之间的所有数据,会匹配出一些空白字符出来,所以我们采用如下代码把空白字符移除。

stock_last=stock_total[:] #stock_total:匹配出的股票数据for data in stock_total: #stock_last:整理后的股票数据
if data=='':
stock_last.remove('')

最后,我们可以打印几列数据看下效果,代码如下

print('代码',' ','简称',' ',' ','最新价',' ','涨跌幅',' ','涨跌额',' ','5分钟涨幅')for i in range(0,len(stock_last),13): #网页总共有13列数据
print(stock_last[i],' ',stock_last[i+1],' ',' ',stock_last[i+2],' ',' ',stock_last[i+3],' ',' ',stock_last[i+4],' ',' ',stock_last[i+5])

热点内容
clinuxsqlite 发布:2024-10-25 19:30:02 浏览:679
值班发布源码 发布:2024-10-25 19:23:50 浏览:369
php实现注册登陆 发布:2024-10-25 19:22:56 浏览:545
android开发库 发布:2024-10-25 18:50:28 浏览:231
优酷路由宝存储 发布:2024-10-25 18:41:37 浏览:934
pythoncmdb 发布:2024-10-25 18:41:29 浏览:200
安卓触控屏不灵怎么办 发布:2024-10-25 17:31:22 浏览:872
中信银行信用卡激活后密码是多少 发布:2024-10-25 17:28:31 浏览:507
cocos2d30编译 发布:2024-10-25 17:20:51 浏览:996
app直播平台源码 发布:2024-10-25 17:19:57 浏览:225