精华内容
下载资源
问答
  • 如果想要查找到有icon这个class的span除了用原始的代码还可以用父级查询的方法进行定位,具体的实现如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助
  • 主要介绍了js中如何通过父级进行查找定位元素,需要的朋友可以参考下
  • 在Oracle数据库中,如何查找定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。感兴趣的朋友跟随小编一起看看吧
  • IP地址精确定位查找

    2019-03-26 11:47:09
    IP地址精确查询 能精确到门牌号--多接口版 ,分享给有需要的朋友
  • 朋友查找器应用程序 朋友查找器应用程序 朋友查找器是Android平台上开发的一款用于在地图上定位朋友的应用程序。
  • 这篇文章主要是对百度地图进行定位当前的位置,同时在当前位置设置圆形覆盖物,后面会实现附近餐馆查找功能。文章比较基础,包括申请API Key、配置环境、官方文档介绍、使用BDLocationListener实现定位监听方法等,...
            很长时间没有做Android相关知识了,闲暇之余再弄了弄最新的百度地图API,主要是进行百度地图附近餐馆查找功能来练练手,同时熟悉下最新的API教程。文章比较基础,也希望对你有所帮助~参考前文:
            [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
            [android] 百度地图开发 (二).定位城市位置和城市POI搜索
            [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation总为空问题
            官方网址:http://developer.baidu.com/map/
            Demo下载地址:


    一. 配置百度API环境


            获取百度地图API Key前,遇到的第一个问题是“小米手机或豌豆荚不能识别USB插口”。解决方法是安装QuickShortcutMaker软件,输入USB启动计算机USB连接。
            参考地址:http://www.miui.com/thread-1733895-1-1.html

      

            百度地图AndroidSDK介绍如下:
            http://developer.baidu.com/map/wiki/index.php?title=androidsdk

            第一步:创建百度地图API Key
            在使用之前,您需要先申请密钥,且密钥和应用证书和包名绑定。
            申请应用新地址:http://lbsyun.baidu.com/apiconsole/key
            百度地图Android SDK申请密钥Key方法如下,也可参照我以前写过的一篇文章:
            http://developer.baidu.com/map/index.php?title=androidsdk/guide/key
            http://blog.csdn.net/eastmount/article/details/42064123



            其中数字签名SHA1通过点击Eclipse的 "窗体(Window)->首选项(Preferences)->Android->Build" 查看,而包名是创建工程BaiduMapRes项目中的包。



            第二步:下载Android SDK并配置
            Android SDK v3.1.0下载地址:
            http://developer.baidu.com/map/sdkandev-download.htm
            最新下载地址,可以选择自己喜欢的开发资源,它会提供相应的文件包:
            http://lbsyun.baidu.com/sdk/download


            在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下,拷贝完成后的工程目录如下图所示:

      

            同时需要导入jar包,右键工程->"Properties(属性)"->"Java构建路径",选择添加JAR,选定baidumapapi_vX_X_X.jar,确定后返回。


    二. Hello BaiduMapAndroid SDK


             第一个百度地图程序参考网址,简单进行叙述下:Hello BaiduMapAndroid


              第一步: 在AndroidManifest中添加开发密钥、所需权限等信息
             在application中添加开发密钥 
    <application ><meta-data /></application> 并添加相关权限。
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.baidumapres"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="19"
            android:targetSdkVersion="19" />
        
        <!-- 获取网络状态  -->  
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
        <!-- 访问网络 -->  
        <uses-permission android:name="android.permission.INTERNET" />  
        <!-- 获取WiFi状态 -->  
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
        <!-- 允许程序写入外部存储,如SD卡上写文件 -->  
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
        <!-- 读取电话状态 -->  
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
        <uses-permission android:name="android.permission.CALL_PHONE" />  
        <!-- 获取精确位置 GPS芯片接收卫星的定位信息,定位精度达10米以内 -->  
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
        <!-- 通过WiFi或移动基站的方式获取用户错略的经纬度信息 -->  
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
        <!-- 获取模拟定位信息 -->  
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />  
        <uses-permission android:name="android.permission.ACCESS_GPS" />
        <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
        <uses-permission android:name="android.permission.WAKE_LOCK"/> 
        <uses-permission android:name="android.permission.GET_TASKS" /> 
    	
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            
            <meta-data  
           		android:name="com.baidu.lbsapi.API_KEY"  
            	android:value="OYl0tcWvGrWtWucQN2rhdxG8" />  
            	
            <activity
                android:name="com.example.baidumapres.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        
    </manifest>

            第二步:在布局xml文件中添加地图控件
            布局文件activity_main.xml中通过加载百度地图控件MapView,它是由百度提供的自定义控件故需要加上完整包名,同时该控件需要接受点击事件clickable设置为true。
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.baidumapres.MainActivity"
        tools:ignore="MergeRootFrame" >
        
        <com.baidu.mapapi.map.MapView  
            android:id="@+id/map_view"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:clickable="true" />  
      
    </FrameLayout>  

            第三步: MainActivity.java文件,创建地图Activity,管理地图生命周期
    package com.example.baidumapres;
    
    import java.util.ArrayList;
    import java.util.List;
    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.OverlayOptions;
    import com.baidu.mapapi.map.PolygonOptions;
    import com.baidu.mapapi.map.Stroke;
    import com.baidu.mapapi.model.LatLng;
    import android.app.Activity;
    import android.os.Bundle;
    
    public class MainActivity extends Activity {
    	
    	//地图
    	private MapView mMapView = null;  
    	private BaiduMap mBaiduMap;
    	
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);   
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
            //注意该方法要再setContentView方法之前实现  
            SDKInitializer.initialize(getApplicationContext());  
            setContentView(R.layout.activity_main);  
            
            //获取地图控件引用  
            mMapView = (MapView) findViewById(R.id.map_view);  
            
            /*
             * 设置地图类型 普通地图
             * 卫星地图 
             * mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);   
             * 开启交通图   
             * mBaiduMap.setTrafficEnabled(true);
             */
            mBaiduMap = mMapView.getMap();  
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  
            
            //几何图形覆盖物
            //定义多边形的五个顶点  
            LatLng pt1 = new LatLng(39.93923, 116.357428);  
            LatLng pt2 = new LatLng(39.91923, 116.327428);  
            LatLng pt3 = new LatLng(39.89923, 116.347428);  
            LatLng pt4 = new LatLng(39.89923, 116.367428);  
            LatLng pt5 = new LatLng(39.91923, 116.387428);  
            List<LatLng> pts = new ArrayList<LatLng>();  
            pts.add(pt1);  
            pts.add(pt2);  
            pts.add(pt3);  
            pts.add(pt4);  
            pts.add(pt5);  
            //构建用户绘制多边形的Option对象  
            OverlayOptions polygonOption = new PolygonOptions()  
                .points(pts)  
                .stroke(new Stroke(5, 0xAA00FF00))  
                .fillColor(0xAAFFFF00);  
            //在地图上添加多边形Option,用于显示  
            mBaiduMap.addOverlay(polygonOption);
            
        }  
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
            mMapView.onDestroy();  
        }  
        @Override  
        protected void onResume() {  
            super.onResume();  
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
            mMapView.onResume();  
            }  
        @Override  
        protected void onPause() {  
            super.onPause();  
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
            mMapView.onPause();  
            }  
    }

            运行该代码简单的测试结果如下所示:包括卫星地图、交通地图、普通地图和五边形覆盖物,其他覆盖物参考官方文档

         


    三. 百度地图位置定位


            基础地图功能介绍参考:http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap
            类方法介绍:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_6_1/
            例如参考下图:MapStatusUpdateFactory方法


            其中百度地图定位主要参考我以前的代码和crazy1235(推荐大家学习)的文章:
            [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation总为空问题
            百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码
            百度地图开发(三)之地图控制 + 定位 - crazy1235

            需要注意的地方和核心步骤包括:
            1.需要添加定位SDK包,在libs中添加locSDK_3.1.jar和liblocSDK3.so;
            2.在AndroidManifest.xml文件中设置service:
    <application>
        <meta-data  
          	android:name="com.baidu.lbsapi.API_KEY"  
            android:value="OYl0tcWvGrWtWucQN2rhdxG8" />
    
        <activity>....</activity> 
        
        <service 
           	android:name="com.baidu.location.f" 
           	android:enabled="true" 
           	android:process=":remote" > 
        </service>
    </application>
            3.代码中通过BDLocationListener实现定位监听,具体代码如下:
    package com.example.baidumapres;
    
    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.BitmapDescriptor;
    import com.baidu.mapapi.map.BitmapDescriptorFactory;
    import com.baidu.mapapi.map.CircleOptions;
    import com.baidu.mapapi.map.MapStatusUpdate;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.MarkerOptions;
    import com.baidu.mapapi.map.MyLocationConfiguration;
    import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
    import com.baidu.mapapi.map.MyLocationData;
    import com.baidu.mapapi.map.OverlayOptions;
    import com.baidu.mapapi.map.Stroke;
    import com.baidu.mapapi.model.LatLng;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    	
    	//百度地图控件
    	private MapView mMapView = null;  
    	//百度地图对象
    	private BaiduMap mBaiduMap;
    	//按钮 添加覆盖物
    	private Button addOverlayBtn;
    	//是否显示覆盖物 1-显示 0-不显示
    	private int isShowOverlay = 1;
    	//按钮 定位当前位置
    	private Button locCurplaceBtn;
    	//是否首次定位
    	private boolean isFirstLoc = true;
    	//定位SDK的核心类
    	private LocationClient mLocClient;
    	//定位图层显示模式 (普通-跟随-罗盘)
    	private LocationMode mCurrentMode;
    	//定位图标描述
    	private BitmapDescriptor mCurrentMarker = null;
    	//当前位置经纬度
    	private double latitude;
    	private double longitude;
    	//定位SDK监听函数
    	public MyLocationListenner locListener = new MyLocationListenner();
    	
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);   
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
            //注意该方法要再setContentView方法之前实现  
            SDKInitializer.initialize(getApplicationContext());  
            setContentView(R.layout.activity_main);  
            
            //获取地图控件  
            mMapView = (MapView) findViewById(R.id.map_view);
            addOverlayBtn = (Button) findViewById(R.id.btn_add_overlay);
            locCurplaceBtn = (Button) findViewById(R.id.btn_cur_place);
            addOverlayBtn.setEnabled(false);
         
            //设置地图缩放级别16 类型普通地图
            mBaiduMap = mMapView.getMap();  
            MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);  
            mBaiduMap.setMapStatus(msu);
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  
            
            //开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
            //定位初始化
            //注意: 实例化定位服务 LocationClient类必须在主线程中声明 并注册定位监听接口
            mLocClient = new LocationClient(this);
            mLocClient.registerLocationListener(locListener);
    		LocationClientOption option = new LocationClientOption(); 
    		option.setOpenGps(true);              //打开GPS
    		option.setCoorType("bd09ll");        //设置坐标类型
    		option.setScanSpan(5000);            //设置发起定位请求的间隔时间为5000ms 
    		mLocClient.setLocOption(option);     //设置定位参数
    		mLocClient.start();                  //调用此方法开始定位    
            
            //Button 添加覆盖物
            addOverlayBtn.setOnClickListener(new OnClickListener() {    
                @Override    
                public void onClick(View v) {
                	addCircleOverlay();
                }    
            });  
    
            //Button 定位当前位置
            locCurplaceBtn.setOnClickListener(new OnClickListener() {    
                @Override    
                public void onClick(View v) {
                	addMyLocation();
                }    
            });  
            
        }  
        
        /**
         * 定位SDK监听器 需添加locSDK jar和so文件
         */
        public class MyLocationListenner implements BDLocationListener {
    
       		@Override
       		public void onReceivePoi(BDLocation location) {
       		}
    
       		@Override
       		public void onReceiveLocation(BDLocation location) {		
       			//mapview 销毁后不在处理新接收的位置
       			if (location == null || mBaiduMap == null) {
       				return;
       			}
       			//MyLocationData.Builder定位数据建造器
       			MyLocationData locData = new MyLocationData.Builder()
       					.accuracy(location.getRadius())
       					.direction(100)
       					.latitude(location.getLatitude())
       					.longitude(location.getLongitude())
       					.build();
       			//设置定位数据
       			mBaiduMap.setMyLocationData(locData);
       			mCurrentMode = LocationMode.NORMAL;
       			//获取经纬度
       			latitude = location.getLatitude();
       			longitude = location.getLongitude();
       			//Toast.makeText(getApplicationContext(), String.valueOf(latitude), Toast.LENGTH_SHORT).show();
       			//第一次定位的时候,那地图中心点显示为定位到的位置
       			if (isFirstLoc) {
       				isFirstLoc = false;
       				//地理坐标基本数据结构
       				LatLng loc = new LatLng(location.getLatitude(),location.getLongitude());
       				//MapStatusUpdate描述地图将要发生的变化
       				//MapStatusUpdateFactory生成地图将要反生的变化
       				MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(loc);
       				mBaiduMap.animateMapStatus(msu);
       				Toast.makeText(getApplicationContext(), location.getAddrStr(), 
       						Toast.LENGTH_SHORT).show();
       			}
       		}
       	}
       
        /**
         * 定位并添加标注
         */
        private void addMyLocation() {
    	    	 //更新
    	       	mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
    	       			mCurrentMode, true, mCurrentMarker));   
    	       	mBaiduMap.clear();
    	       	addOverlayBtn.setEnabled(true);
    	       	//定义Maker坐标点  
    	       	LatLng point = new LatLng(latitude, longitude);  
    	       	//构建Marker图标  
    	       	BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);  
    	       	//构建MarkerOption,用于在地图上添加Marker  
    	       	OverlayOptions option = new MarkerOptions()  
    	       		.position(point)  
    	       	    .icon(bitmap);  
    	       	//在地图上添加Marker,并显示  
    	       	mBaiduMap.addOverlay(option);
           }
        
        /**
         * 添加覆盖物
         */
        private void addCircleOverlay() {
        	if(isShowOverlay == 1) {  //点击显示
        		mBaiduMap.clear();
        		isShowOverlay = 0;
                //DotOptions 圆点覆盖物
                LatLng pt = new LatLng(latitude, longitude); 
                CircleOptions circleOptions = new CircleOptions();
                //circleOptions.center(new LatLng(latitude, longitude));
                circleOptions.center(pt);                          //设置圆心坐标  
                circleOptions.fillColor(0xAAFFFF00);               //圆填充颜色
                circleOptions.radius(250);                         //设置半径 
                circleOptions.stroke(new Stroke(5, 0xAA00FF00));   // 设置边框
                mBaiduMap.addOverlay(circleOptions); 
        	} 
        	else {
        		mBaiduMap.clear();
        		isShowOverlay = 1;
        	}
        }
        
        @Override  
        protected void onDestroy() {  
        	mLocClient.stop();                       //退出时销毁定位
            mBaiduMap.setMyLocationEnabled(false);   //关闭定位图层
            mMapView.onDestroy();  
            mMapView = null;
            super.onDestroy();  
        }  
        
        @Override  
        protected void onResume() {  
            super.onResume();  
            mMapView.onResume();  
        }  
        
        @Override  
        protected void onPause() {  
            super.onPause();   
            mMapView.onPause();  
        }  
    }
            运行结果如下图所示"我的位置"和"添加覆盖物":

           


    四. 百度地图POI附近餐馆查找


            PS:这部分下一篇文章将详细介绍,主要是POI附件餐馆和路线规划。



    五. 新年祝福


            最后分享自己圣诞节大学面试和新年祝福的qq说说,与君卿共勉~

         《你明明可以靠才华吃饭,却偏偏要去拼颜值》
          很幸运!第一次坐飞机,是为了回家那边的大学去讲课和面试;第一次穿西装,白衬衣里套了三件衣服,其中一件毛衣,别冷着自己就行;第一份圣诞老人的礼物,居然是一份讲台前当老师的承诺。
          来之前,一位朋友曾问过我:“你明明可以靠才华吃饭,却偏偏要去拼颜值教书吗?”我的回答是:“我有颜值吗?哈哈,其实教书也能展现我的才华与魅力的啊!”
          的确,我也可以去到一个公司,扎扎实实写代码,一个月一万四左右;也有很多创业公司找我做搜索图谱、图像处理、python、selenium。但我更期待自己在讲台前和科研实验室的情景,画面太美,不敢想。
          十年后,我不知道自己会不会像春哥的老师一样,也写一篇《别了,这狗日的科研》而放弃大学?但此时此刻还是非常乐观的,至少除了科研教学外,我还会写点代码,这就饿不着;还可以写点文章博客和讲课吧。很多时候,想是一回事,说是一回事,做又是另外一回事。一辈子,又能做多少自己喜欢的事情呢?对吧!
          刚刚找工作的那段时间,我看到了一句话:千里马若有人赏识,不论对错,不为输赢。我那时也希望我为一家IT公司奉献很多年,赚个几十万。但后来,我才发现最欣赏我这匹“蠢马”的伯乐,应该在大学,或许就是芸芸众生中的学子一员,或许是那个面试的领导(虽然他一直想不明白一个搞软件的男生为什么要来贵州这边的大学),再或许就是我自己的孤芳自赏吧!
         《低俗小说》里面好像有这样一句话:Pride only hurts, it never helps. 有时候自尊心只会让你受伤,其他毫无用处。希望自己在大学能抹去那份傲娇,跟着心走,十年如一日的去坚持那份热情吧!毕竟短暂的激情是不值钱的,只有长久的激情才值钱。
           哎!讲完课的当时,还是有一点低落,工资现在只有开发的一个零头了。痛,所以我这么多搞开发的小伙们,以后来找你们玩的时候,懂吧!哈哈,开个玩笑~这里的工作环境和方式我真心喜欢,而且又能教书!
           最后用自己的博客签名结束这篇文章吧!“无知·乐观·低调·谦逊·生活“。时刻告诉自己:无知的我需要乐观的去求知,低调的底色是谦逊,而谦逊是源于对生活的通透,我们不止有工作、学习、编程,还要学会享受生活,人生何必走得这么匆忙,开心就好!fighting
            新的一年自己最大的愿望就是希望成为一名大学老师,并且身体健康就好!
           (By:Eastmount 2016-01-06 夜3点 http://blog.csdn.net/eastmount/

            


    展开全文
  • ...写几点内容给学习STM32的朋友 STM32数据手册中那些重要内容 教大家几招快速访问ST官网的方法 关注公众号『strongerHuang』,在 底部菜单中查看更多精彩内容 ! 长按 识别图中二维码 关注

    关注、星标公众,不错过精彩内容


    640?wx_fmt=jpeg


    本文主要给大家介绍快速找到STM8、STM32软件工具、文档资料的方法和技巧


    一、网站

    ST官网:www.st.com

    ST社区:www.stmcu.org.cn

    ST中文网:www.stmcu.com.cn

    (公众号不支持外链接,请复制网址到浏览器打开)


    查找STM32的软件工具、文档资料,推荐到以上三个网站,但强烈建议到ST官网查找(最新、最权威)。


    二、ST官网

    ST官网:www.st.com


    许多小伙伴觉得ST官网是英文(有中文版,但基本也是英文),而且比较“卡”,查找STM32的资料比较麻烦。


    其实不然,ST网站经过多次改版,在ST官网找资料软件是最容易的,而且是最新、最权威的


    容易体现在两方面:

    • 网站导航清晰

    • 网址有规律


    1.网址导航清晰

    导航可以理解为菜单,以菜单作为入口,一步一步找到自己所需软件工具、资料文档。


    从产品(Products)菜单查找文档资料:

    640?wx_fmt=png


    从工具软件(Tools & Software)菜单查找软件工具:

    640?wx_fmt=png


    自己经常通过导航查找资料,久而久之自己也会得出经验。


    2.网址有规律

    仔细查看下面网址,你发现其中的规律了吗?

    640?wx_fmt=png

    通过以上两种方法可快速定位网址,找到你所需要软件工具、文档资料等。


    三、针对具体型号MCU

    包含文档资料和开发对应的工具等。


    文档资料:数据手册、参考手册、编程手册、用户手册···等。

    640?wx_fmt=png


    工具:STM32CubeMX、STM32CubeProg等。

    640?wx_fmt=png


    比如STM32F103ZE:

    https://www.st.com/en/microcontrollers-microprocessors/stm32f103ze.html

    假如你想查找STM32F407VE的资料工具,修改网址中MCU型号即可

    https://www.st.com/en/microcontrollers-microprocessors/stm32f407ve.html


    同样道理,针对STM8也是类似,比如STM8S103F3:

    https://www.st.com/en/microcontrollers-microprocessors/stm8s103f3.html


    提示:

    开发MCU所需资料工具,基本能从这个网址下找到(记住这个网址很重要)。


    三、ST常用网址

    ST网址其实有很多规律,找到其中规律,你可以快速定位网址,也就能快速找到对应的资料、软件。


    这里罗列一些常用网址(请大家仔细查看网址,你也能发现其中规律)。


    1.STM8、32标准外设库(SPL)

    A.STM8标准外设库

    http://www.st.com/en/embedded-software/stm8-embedded-software.html?querycriteria=productId=SC1807

    包含STM8S、STM8AF、STM8L、STM8AL全系列标准外设库,展开即可看见。


    B.STM32标准外设库

    http://www.st.com/en/embedded-software/stm32-embedded-software.html?querycriteria=productId=SC961

    选择STM32 Standard Peripherals Librarys即可看见STM32F0、F1、F2、F3、F4、L1的库(F7、L0、L4官网只提供HAL库)。


    2.STM32CubeIDE

    https://www.st.com/en/development-tools/stm32cubeide.html


    3.STM8、32CubeMX

    https://www.st.com/en/development-tools/stm8cubemx.html

    https://www.st.com/en/development-tools/stm32cubemx.html

    4.STM32CubeProgrammer

    https://www.st.com/en/development-tools/stm32cubeprog.html

    5.STM32 ST-LINK Utility

    https://www.st.com/en/development-tools/stsw-link004.html

    6.STM32 Flash loader

    https://www.st.com/en/development-tools/flasher-stm32.html

    (公众号不支持外链接,请复制网址到浏览器打开)

    当然,还要更多内容,后续我会在公众号底部菜单整理出来。


    提示:

    ST的网址后续可能会改版,网址可能会变化,但不用担心,改版之后依然可继续使用之前网址(映射,兼容)。


    推荐阅读:

    写几点内容给学习STM32的朋友

    STM32数据手册中那些重要内容

    教大家几招快速访问ST官网的方法


    关注公众号『strongerHuang』,在底部菜单中查看更多精彩内容!

    640?wx_fmt=jpeg

    长按识别图中二维码关注

    展开全文
  • 应用程序崩溃定位查找 (一)

    千次阅读 2015-10-12 10:29:12
    与内存相关的崩溃的来源很难精确定位,因为邪恶可能更早在程序中完成。 如果一块故障代码的内存结构使人腐化,这结果可能不会显示,直到很久以后,和在一个完全不同的地方。 事实上,bug 可能永远不会出现在你在...

    它发生在我们最好的: 你工作愉快地在您的应用程序,一切都很好,然后突然 — — 噗!— — 它的崩溃。收纳!!(线索悲伤小提琴)。

    第一件事是: ,不要惊慌!

    固定崩溃并不需要硬。你可能会进一步恶化的情况,如果你抓狂,开始随意改变一些东西,希望该 bug 会神奇地消失如果只你说出正确的咒语。相反,您需要采取系统的方法和学习如何您的方式通过一个崩溃的原因。

    第一要务是找出确切地在您的代码下崩溃发生: 在哪个文件和哪些行。Xcode 调试器会帮助你这一点,但您需要了解如何善用它,而这正是本教程将告诉你!

    本教程是为所有的开发人员,从初级到高级。即使你是经验丰富的 iOS 开发者,你可能会捡拾了一些提示和技巧一路走来你不知道!

    入门

    下载示例项目你会看到,这是一个漏洞百出的程序!当你在 Xcode 中打开该项目时,它显示了至少八个编译器警告,始终是将来麻烦的预兆。顺便说一句,我们使用 Xcode 4.3 对于本教程,虽然 4.2 版应该工作一样。

    注:要跟随本教程中,应用程序需要运行在 iOS 5 模拟器。如果您在您的设备上运行应用程序,你还是会崩溃,但他们可能不会发生相同的顺序。

    在模拟器中运行应用程序,看看会发生什么。

    The app crashes immediately.

    嘿,它崩溃了!:-]

    基本上有两种类型的可能发生的崩溃: SIGABRT (也称为 EXC_CRASH) 和EXC_BAD_ACCESS (其中 SIGBUS 或 SIGSEGV 的名义也可以显示)。

    据崩溃去,SIGABRT 是一个非常好,因为它是受控制的崩溃。应用程序故意终止,因为系统识别应用程序做了它不能这样做。

    另一方面,EXC_BAD_ACCESS,是很难调试,因为它只有当应用程序进入损坏的状态,通常是由于内存管理问题。

    幸运的是,这第一次坠毁 (许多尚未来) 是 SIGABRT。SIGABRT 总是带有一条错误消息,您可以看到在 Xcode 的调试输出窗格 (底部窗口的右下角)。(如果看不到调试输出窗格中,点击你 Xcode 窗口以显示调试区域上右上角的视图图标部分的中间图标。如果仍然调试输出窗格不可见,您可能必须点击顶部的调试区域 — — 搜索字段旁边的图标的中间图标)。在这种情况下,它说,这样的事情:

    Problems[14465:f803] -[UINavigationController setList:]: unrecognized selector sent to
    instance 0x6a33840
    Problems[14465:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',
    reason: '-[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840'
    *** First throw call stack:
    (0x13ba052 0x154bd0a 0x13bbced 0x1320f00 0x1320ce2 0x29ef 0xf9d6 0x108a6 0x1f743
    0x201f8 0x13aa9 0x12a4fa9 0x138e1c5 0x12f3022 0x12f190a 0x12f0db4 0x12f0ccb 0x102a7
    0x11a9b 0x2792 0x2705)
    terminate called throwing an exception

    很重要的是你学会破译这些错误消息,因为它们包含了什么问题的重要线索。在这里,有趣的部分是:

    [UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840

    错误消息"无法识别的选择器发送以实例 XXX"意味着应用程序正试图调用不存在的方法。经常发生这种情况因为在错误的对象上调用的方法。在这里,所讨论的对象是 UINavigationController (位于 0x6a33840 的内存地址),方法是曲目:.

    知道飞机坠毁的原因是好的但是你第一次的行动方针是找出代码中此错误发生。你需要找到的名称的源文件和行为不端的行的编号。你可以使用调用堆栈(也称为栈跟踪或回溯)。

    当应用程序崩溃,Xcode 窗口切换到调试导航器的左窗格。报告显示在应用程序中,活跃的线程,并突出崩溃的线程。通常,将线程 1,主线程的应用程序,因为这是在哪里,你会做你的大部分工作。如果您的代码使用队列或后台线程,然后应用程序可能会崩溃中的其他线程。

    The call stack. It doesn't show everything yet.

    目前,Xcode 突出了在main.m main ()函数作为问题的根源。这不告诉你很多,所以你只好挖深一点。

    若要查看更多的调用堆栈,一路向右拖动滑块底部的调试导航。在崩溃的时刻,将显示完整的调用堆栈:

    The expanded call stack.

    每个从该列表中的项目是一个函数或方法,从应用程序或从 iOS 框架之一。调用堆栈显示你什么函数或方法是在应用程序中当前处于活动状态。调试器已暂停应用程序和所有这些函数和方法现在被冻结了。

    在底部, start (),函数在第一次调用。在某个地方在其执行它叫上面,main ()函数。这是该应用程序的起点,它总是会在底部附近。main ()又被称为UIApplicationMain()这是行的 (在 Xcode 的右窗格中突出显示的开头) 的绿色箭头指向在编辑器窗口中的行。

    UIApplicationMain()进一步上涨堆栈,调用_run方法上的 UIApplication 对象,称为CFRunLoopRunInMode(),称为CFRunLoopRunSpecific(),依此类推,一直到__pthread_kill.

    How a call stack works.

    所有的这些函数和方法中调用堆栈,除了main (),呈灰色。这是因为他们来自内置 iOS 框架。有是没有源代码提供给他们。

    此异常堆栈包含源代码唯一永恒的东西是main.m,所以这就是 Xcode 源代码编辑器中显示的内容,尽管它不是真的崩溃的真正来源。这往往混淆新的开发人员,但在一分钟内,我将显示你如何使它的意义。

    为了好玩,点击任何一个其他的项从栈跟踪,你会看到一堆的汇编代码,可能你不有太大的意义:

    If there is no source code, Xcode shows assembly.

    哦,要是我们有源代码的!:-]

    异常断点

    使应用程序崩溃的代码中,你如何找到行?好吧,每当你得到这样的栈跟踪,异常被引发 (你可以告诉,因为函数调用堆栈中的一个叫objc_exception_rethrow的应用.)

    当该程序抓住做不应该做的事情时,将发生异常。你现在看着是此异常的后果: 应用程序做了一些错事,异常,和 Xcode 显示你的结果。理想情况下,你会想要看到准确获取抛出该异常。

    幸运的是,你可以告诉 Xcode 来暂停程序,只是那一刻,使用异常断点。断点是在某一特定时刻暂停您的程序的调试工具。你会看到更多的人在本教程中,第二部分,但现在您将使用具体的断点将暂停程序,只是之前获取引发异常。

    若要设置异常断点,我们必须切换到断点导航:

    The Breakpoint Navigator

    底部是一个小小的 + 按钮。单击此按钮,然后选择添加异常断点:

    Adding the Exception Breakpoint

    新断点将添加到列表中:

    After the Exception Breakpoint has been added

    单击完成按钮关闭弹出框。Xcode 的工具栏中的断点按钮现在已启用的通知。如果你想要无任何已启用的断点运行应用程序,您可以简单地切换此按钮可关闭。但现在,离开它,再次运行该应用程序。

    After the crash, the problematic source line is now highlighted.

    这是更好!源代码编辑器现在指向一条线从源代码 — — 不再讨厌大会的东西 — — 和通知调用堆栈在左边 (您可能需要切换到调用堆栈通过取决于你怎么有 Xcode 设置中的调试导航) 也看起来不同。

    显然,罪魁祸首就是这条线在 AppDelegate 的应用程序: didFinishLaunchingWithOptions:方法:

    	viewController.list = [NSArray arrayWithObjects:@"One", @"Two"];

    再看看那条错误消息:

    [UINavigationController setList:]: unrecognized selector sent to instance 0x6d4ed20

    在代码中,"viewController.list = 东西"调用曲目:在幕后,因为"名单"是MainViewController类的属性。不过,根据错误消息 viewController 变量不指向到一个 MainViewController 对象,但对 UINavigationController — — 而且当然,UINavigationController 并没有"列表"属性!所以事情混淆了这里。

    打开要看到窗口的 rootViewController 属性实际上指向的演示图板文件:

    The storyboard has a navigation controller.

    啊哈哈!演示图板的初始视图控制器是一个导航控制器。这解释了为什么 window.rootViewController 是一个 UINavigationController 对象,而不是你期望的 MainViewController。若要解决此问题,请替换应用程序: didFinishLaunchingWithOptions:以下列:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    	UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
    	MainViewController *viewController = (MainViewController *)navController.topViewController;
    	viewController.list = [NSArray arrayWithObjects:@"One", @"Two"];
    	return YES;
    }

    首先你从 self.window.rootViewController,对 UINavigationController 的引用,然后一旦你有了这些你也可以得到指针到 MainViewController 索要其 topViewController 导航控制器。现在 viewController 变量应该指向正确的对象。

    注:每当你得到一个"无法识别选择器发送到实例 XXX"错误,请检查该对象是正确的类型和它实际上已具有该名称的方法。通常你会发现,你是对对象调用方法不同比你想象的因为一个指针变量可能不包含正确的值。

    The different parts of the "Unrecognized selector" error message.

    此错误的另一个常见原因是方法名称的拼写错误。你会看到一个这样的例子在位。

    你第一次内存错误

    那应该固定我们第一个问题。再次运行该应用程序。哎呦,它坠毁在同一行上,现在只有一个 EXC_BAD_ACCESS 错误。这意味着应用程序有一个内存管理问题。

    Our first EXC_BAD_ACCESS error.

    与内存相关的崩溃的来源很难精确定位,因为邪恶可能更早在程序中完成。如果一块故障代码的内存结构使人腐化,这结果可能不会显示,直到很久以后,和在一个完全不同的地方。

    事实上,bug 可能永远不会出现在你在所有测试时,前后只有它丑陋的头在你的客户的设备上。你不想这样的事情发生!

    然而,这个特定的崩溃,很容易解决。如果你看看源代码编辑器,Xcode 一直在警告你说这条线一直以来。在左边的行号上看到黄色的三角形吗?指示编译器警告。如果你点击黄色三角形,Xcode 应该弹出一个"修复它"建议像这样:

    Xcode warns about a missing sentinel.

    通过给它的对象,列表和此类列表 NSArray 对象应该终止使用零代码初始化,哨兵警告中提到。但这并不做和现在 NSArray 获取混为一谈。它试图读取,并不存在的对象和应用程序崩溃硬。

    这是你真的不应该做,尤其是因为 Xcode 已经警告您关于它的错误。修复代码,如下所示添加到列表中的零 (或只是可以从菜单中选择"修复它"选项):

    	viewController.list = [NSArray arrayWithObjects:@"One", @"Two", nil];

    "此类不是键值编码兼容"

    运行该应用程序,再来看什么其他有趣的 bug 这个项目已经在商店为您。和你知道吗?它再次崩溃在main.m上。由于异常断点仍处于启用状态,我们看不到任何突出显示的应用程序源代码,这次失事真正没有发生任何应用程序源代码中。调用堆栈证实这: 这些方法都不属于该应用程序,除了main ():

    The call stack for the "key value coding" crash.

    如果你从楼顶下来看通过的方法名称,有 NSObject 和键-值编码发生了一些东西。下面是[UIRuntimeOutletConnection 连接]呼吁。我也不知道什么是,但它看起来像它已经跟连接插座。下面,是谈论从笔尖加载视图的方法。因此,那已经给你一些线索。

    然而,没有方便错误信息是 Xcode 的调试窗格中。这是因为没有尚未引发该异常。异常断点已暂停程序,只是之前它会告诉你异常的原因。有时你得到部分的错误信息与异常断点启用,而有时你不知道。

    若要查看完整的错误消息,请单击调试器工具栏中的"继续程序执行"按钮:

    The Continue Program Execution button.

    您可能需要单击它不止一次,但然后您会收到错误消息:

    Problems[14961:f803] *** Terminating app due to uncaught exception 'NSUnknownKeyException', 
    reason: '[<MainViewController 0x6b3f590> setValue:forUndefinedKey:]: this class is not
    key value coding-compliant for the key button.'
    *** First throw call stack:
    (0x13ba052 0x154bd0a 0x13b9f11 0x9b1032 0x922f7b 0x922eeb 0x93dd60 0x23091a 0x13bbe1a 
    0x1325821 0x22f46e 0xd6e2c 0xd73a9 0xd75cb 0xd6c1c 0xfd56d 0xe7d47 0xfe441 0xfe45d 
    0xfe4f9 0x3ed65 0x3edac 0xfbe6 0x108a6 0x1f743 0x201f8 0x13aa9 0x12a4fa9 0x138e1c5 
    0x12f3022 0x12f190a 0x12f0db4 0x12f0ccb 0x102a7 0x11a9b 0x2872 0x27e5)
    terminate called throwing an exception

    作为之前,您可以忽略底部的数字。他们代表调用堆栈,但你已经有了,以一种更方便 — — 和可读!— — 在左边的调试导航中的格式。

    有趣的片段如下:

    • NSUnknownKeyException
    • MainViewController
    • "此类不是键值编码兼容为关键的按钮"

    异常,NSUnknownKeyException 的名称通常是很好的指标是错误。它告诉你有什么地方是"未知的钥匙"。某天某地,显然是 MainViewController,和关键被命名为"按钮"。

    当我们建立了所有这一切都发生加载笔尖时。应用程序使用演示图板,而不是笔尖,但内部演示图板只是一个集合家发钞银行,因此它必须是一个演示图板中的错误。

    查阅 MainViewController 插座:

    The button outlet in the storyboard.

    在连接检查器中,您可以看到的视图控制器中心 UIButton 连接到 MainViewController 的"按钮"插座。因此,情节提要/笔尖指插座命名"按钮,"但根据错误消息,它找不到这个插座。

    看一看MainViewController.h:

    @interface MainViewController : UIViewController
     
    @property (nonatomic, retain) NSArray *list;
    @property (nonatomic, retain) IBOutlet UIButton *button;
     
    - (IBAction)buttonTapped:(id)sender;
     
    @end

    @property 定义为"按钮"插座有,是什么问题吗?如果你一直关注编译器的警告,你可能会发现它已经。

    如果没有,请查阅MainViewController.m/s @synthesize 列表。现在看到的问题吗?

    代码不实际上多 @synthesize 按钮属性。它告诉 MainViewController,它有一个名为"按钮,"而不为它提供支持实例变量和 getter 和 setter 方法 (这是什么所 @synthesize 做)。

    低于现有的 @synthesize 线,若要解决此问题在MainViewController.m中添加以下内容:

    @synthesize button = _button;

    现在应用程序应该不再崩溃当你运行它!

    注:该错误通常"此类不是键值编码兼容键 XXX"时发生加载实际上并不存在的属性是指的笔尖。这通常发生在你删除插座属性,从您的代码,但不是能从笔尖的连接。

    按下按钮

    现在,该应用程序的工作 — — 或在至少启动没有问题 — — 同时,点击该按钮的时间。

    The app finally starts up.

    哇!应用程序崩溃与 SIGABRT 在main.m上。在调试窗格中的错误消息是:

    Problems[6579:f803] -[MainViewController buttonTapped]: unrecognized selector sent
    to instance 0x6e44850

    堆栈跟踪并不是太富有启发性。它列出一大堆的方法相关的一种方法或其他发送事件和执行操作,但是你已经知道了涉及行为。毕竟,你点击 UIButton 和,结果在被调用 IBAction 方法。

    当然,你看到这个错误消息之前。被调用的方法不存在。这次的目标对象,MainViewController,看起来是那个合适的人,因为操作方法通常住在包含按钮的视图控制器。并且如果你看一下MainViewController.h,IBAction 方法是确实有:

    - (IBAction)buttonTapped:(id)sender;

    或者是它吗?错误消息表示方法名称是buttonTapped,但 MainViewController 有一种方法命名为buttonTapped:,以冒号结尾因为此方法接受一个参数 (名为"发件人")。方法名称的错误消息,从另外一方面,不包括冒号和因此不带任何参数。该方法的签名而是看起来像这样:

    - (IBAction)buttonTapped;

    在这里发生了什么?该方法最初没有参数 (某物所允许的操作方法),在这段时间的演示图板中建立了连接到这个按钮触摸内部事件。然而,一些时间后,方法签名更改为包含"发件人"参数,但未更新演示图板。

    您可以在连接检查器按钮上的演示图板中看到:

    The button's connections in the storyboard.

    首先断开连接事件 (单击小 X) 触摸里面,然后再将其连接到主视图控制器但这次选择buttonTapped:方法。请注意,在检查器中连接有现在一个冒号后的方法名称。

    运行应用程序,再点击按钮。什么?!你再"无法识别选择器"的消息,尽管这一次它正确地标识方法作为buttonTapped:,用冒号。

    Problems[6675:f803] -[MainViewController buttonTapped:]: unrecognized selector sent
    to instance 0x6b6c7f0

    如果你仔细看,编译器警告应指向你的解决方案再一次。Xcode 抱怨,MainViewController 的执行是不完整。具体来说,方法定义为buttonTapped:找不到。

    Xcode shows an incomplete implementation warning.

    来看看MainViewController.m的时间。当然似乎是buttonTapped:方法在那里,虽然......等等,它拼错了:

    - (void)butonTapped:(id)sender

    容易修复。重命名的方法:

    - (void)buttonTapped:(id)sender

    请注意,你不一定需要将它声明为 IBAction,虽然你可以这样做,如果你认为是整齐的。

    注:这种事情是很容易赶上如果你注意到编译器警告。就个人而言,我将所有警告视为致命错误 (甚至还有选项为此生成设置屏幕中 Xcode) 和之前运行的应用,以及 Xcode 是很擅长指出了愚蠢的错误,像这些一样,它是明智的要注意这些提示,我会搞定的他们每一个人。

    摆弄内存

    你知道钻: 运行应用程序,点击按钮,等待飞机坠毁。没错,就是这样:

    The app crashes on NSLog().

    它是那些 EXC_BAD_ACCESS,另一个呀!幸运的是,在 Xcode 显示你到底在哪里崩溃发生了,在buttonTapped:方法:

    	NSLog("You tapped on: %s", sender);

    有时这些错误可能需要一两个片刻登记在你的头脑,但再次 Xcode 借伸出援助之手 — — 只是水龙头黄色的三角形,看看有什么不对:

    Objective-C strings must have a @ prefix.

    NSLog()采用目的型 C 字符串,不是普通旧 C-字符串,所以插入 @ 将修复它:

    	NSLog(@"You tapped on: %s", sender);

    你会注意到黄色警告三角不会消失。这是因为这条线有可能或不可能会崩溃,您的应用程序的另一个 bug。那些有趣的人。有时代码工作就好 — — 或至少出现上班就好 — — 而在其他时间它会崩溃。(当然,这些各种各样的崩溃仅发生在客户的设备上,从来没有对你自己)

    让我们看看新的警告是:

    Xcode warns about a format string issue.

    %S 说明符为 C 样式字符串。C 字符串是只是一段记忆 — — 一个普通老的字节数组 — — 那终止由所谓的"NUL 字符,"真的只值 0。例如,C 字符串"崩溃!"看起来像这样在内存中:

    What a C-string looks like in memory.

    每当你使用一个函数或期望的 C 样式字符串的方法,你必须确保字符串的值为 0,以结束或功能将不能识别的字符串已经结束。

    现在,当您指定 %s 以NSLog()格式字符串 — — 或在 NSString 的 stringWithFormat — — 该参数被解释好像它是一个 C 字符串。在这种情况下,"发件人"为参数,而是指向一个 UIButton 对象,这当然是 C 字符串的指针。如果无论"发件人"指向包含一个 0 字节,则NSLog()不会崩溃,但输出的东西如:

    You tapped on: xËj

    实际上,你可以看到这来自何处。再次运行该应用程序,点击按钮,等待飞机坠毁。现在,在左半部分的调试窗格中,右键单击"发件人"并选择"查看内存的 * 发件人"选项 (请务必选择一个带有星号在发件人)。

    The view memory menu option.

    Xcode 现在将显示你的内存内容在该地址,而它正是NSLog()打印出来。

    Xcode shows the contents of memory.

    然而,就不能保证是 NUL 字节,一个字节,你可能只是作为容易遇到 EXC_BAD_ACCESS 错误。如果你总是测试您的应用程序可能不会发生长时间在模拟器上,作为这种情况下总是可能对你有利你特定的测试环境中。这使得这些类型的 bug 很难跟踪。

    当然,在这种情况下 Xcode 已经警告你关于错误的格式说明符,所以这个 bug 是很容易找到。但每当你使用 C 字符串或者直接操作内存,你必须非常小心,不糊弄别人的记忆。

    如果你幸运的话,该应用程序将会总是崩溃和 bug 很容易找到,但更常见的是,应用程序将仅崩溃有时 — — 使这一问题很难再重现!— —,然后寻找 bug 可以采取上空前绝后。

    修复NSLog()语句,如下所示:

    	NSLog(@"You tapped on: %@", sender);

    运行应用程序并再一次摁下按钮。NSLog()做什么它应该,但看起来好像你不会崩溃在buttonTapped:尚未。

    调试器和交朋友

    这个最新的崩溃,Xcode 指向线:

    	[self performSegueWithIdentifier:@"ModalSegue" sender:sender];

    在调试窗格中还有没有消息。像你以前,但也可以键入命令在调试器中得到错误消息,您可以按继续程序执行按钮。这样做的好处是应用程序在同一个地方可以呆在暂停。

    如果您正在运行这从模拟器,你可以键入后 (lldb) 提示以下内容:

    (lldb) po $eax

    LLDB 是默认调试器 Xcode 4.3 和起来。如果你使用的旧版本的 Xcode,然后你有了 GDB 调试器。他们分享一些基本的命令,所以如果你 Xcode 提示说 (gdb) 而不是 (lldb),你应该仍然能够跟着没有问题。(顺便说一句,你可以切换中的计划编辑器中 Xcode 下运行操作, 调试器。你可以访问计划编辑器通过 Alt 点击运行在你 Xcode 窗口左上角的图标)。

    蒲命令代表"打印对象"。$eax 符号指 CPU 寄存器之一。发生的异常,这个寄存器将包含指向 NSException 对象的指针。注: $eax 仅适用于模拟器,如果你需要使用的设备上调试注册 $r0。

    例如,如果您键入:

    (lldb) po [$eax class]

    您将看到这样的事情:

    (id) $2 = 0x01446e84 NSException

    这些数字不重要,但很明显你在处理一个 NSException 对象在这里。

    在此对象上,可以从 NSException 调用的任何方法。例如:

    (lldb) po [$eax name]

    这会给你这个案例的 NSInvalidArgumentException,异常的名称和:

    (lldb) po [$eax reason]

    这会给你的错误消息:

    (unsigned int) $4 = 114784400 Receiver (<MainViewController: 0x6b60620>) has no
    segue with identifier 'ModalSegue'

    注:当你只是做"po $eax"时,它将调用该对象上的"描述"方法和打印它,在这种情况下也给你的错误消息。

    这就解释了什么: 你正在尝试执行名为"ModalSegue"的界限,但显然 MainViewController 上有没有这种界限。

    情节提要并显示的继续存在,但你忘记了要设置它的标识符,一个典型的错误:

    Giving the segue an identifier.

    变化的界限标识符为"ModalSegue"。再次运行该应用程序 — — 等待它 — — 点击按钮。哎哟,这不更崩溃的时间!但这里是挑逗的我们接下来的部分 — — 表视图,其中显示了本不应该是空!


    跳转:应用程序崩溃定位查找 (二)

    展开全文
  •  这里关于系统页不过多的介绍,想详细了解的朋友请参见 : SQL Server中的GAM页和SGAM页   我创建个临时表跟系统页还有关系?  下面也用一个例子说明 :    创建临时表的时候会对系统表中进行插入...

    步骤1.TempDB压力诊断

    等待类型诊断

    TempDB的争用压力在等待篇中已经简单介绍,等待的表现为 pagelatch_类等待,等待的资源是 “2: X :X ”

     

     

    tempDB所在磁盘的响应时间

     

    一个实例下只有一个tempdb,也就是当你在一个实例下创建了100个数据库,这100个数据库也只能用这一个TempDB。

    你创建的临时表,或SQL执行语句所需要的排序等操作都需要用到Tempdb。所以TempDB对磁盘的响应时间要求比较高。

    步骤2.解决问题

     

    把TempDB设置成多个来分摊这个压力。

    分成多个文件

        作为一般规则,如果逻辑处理器数小于或等于 8,使用和逻辑处理器相同数量的数据文件。如果逻辑处理器数大于 8 时,使用 8 个数据文件,然后如果仍然存在争用,增加数据文件数4 的倍数(最多的逻辑处理器数)直到争用降低到可接受的程度或对工作负荷/代码进行更改。

    文件大小、增长率要相同

       这里需要注意一个小细节,你所分配的文件必须大小一致,如果设置自动增长那么增长率要相同

        

     

     

     

    TempDB磁盘划分

        大多数情况下,TempDB的文件不需要拆分磁盘,在同一个磁盘即可,如果压力大可以选择放置在一个单独的磁盘中,这样不会与其他文件(如数据读写)发生磁盘资源竞争。

        

     

        如果出现TempDB 读取响应时间高的情况,请考虑,TempDB的磁盘相关优化,如将TempDB文件单独放入比较快的磁盘。

     

     

    步骤3.语句调优

      语句调优篇提到语句中使用临时表或表变等会减少语句的复杂度,提升语句的效率,是常用的三板斧之一,但这里的需要一个平衡。如果对语句过度使用会造成文中提到的TempDB压力。那么怎么样平衡呢?下面给出几点建议:

    1. 切记不要过度使用临时表!临时表的使用主要有两个场景,拆分语句降低复杂性。另一个是缓存中间结果避免重复操作。
    2. 减少使用临时表锁系统表的时间!”select 字段 into #临时表 from“ 如果语句执行时间过长这将是灾难,尽量选用先创建,后插入的做法。
     
     
     

    原理:TempDB压力从哪来?

        当数据库创建一张新表的时候,SQL Server要为这张表分配存储页面,同时SQL Server也要修改SGAM, PFS, 和GAM页面,把已经分配出去的页面标志成已使用。所以每创建一张新表,SGAM, PFS, 和GAM这些系统页面都会有修改动作。这种行为对一般的用户数据库不会有问题,因为正常的应用不会折腾着不停地建表、删表。但是tempdb就不同了。如果一个存储过程使用了临时表,而这个存储过程被并发用户广泛使用,那很自然地就会有很多并发用户在tempdb里同时创建表,做完了以后又删除表。这样,在一个时间点,会有很多任务要修改SGAM, PFS, 或GAM页面。但是为了维护物理的一致性,对于同一个页面,SQL Server在一个时间点同时只允许一个用户修改它。所以对于tempdb,如果同时有很多很多人要在同一个数据文件里分配空间,那这个数据文件的SGAM, PFS, 或GAM页面,就有可能成为系统瓶颈。大家只能一个一个做,并发度上不去。

        这就好像你进停车场要登记交费一样!一个一个来不要急~

        

     

        等待资源为 : “2:1:3” 这是什么意思? ID 为 2 的数据库(TempDB)的 1号文件 的 页码为3的页(SGAM页面)!

     

        

     

     

        这里关于系统页不过多的介绍,想详细了解的朋友请参见 :  SQL Server中的GAM页和SGAM页

     

    我创建个临时表跟系统页还有关系?

        下面也用一个例子说明 : 

        创建临时表的时候会对系统表中进行插入和更新,而删除临时表逆向过程会删除或更新系统表!

     
    use [AdventureWorks2012]
    GO
    checkpoint
    go
    create table #t
    (
    id int
    )
    drop table #t
    
    
    use tempdb
    go
    select Operation,CONTEXT,[Transaction ID],AllocUnitId,AllocUnitName,[Page ID],[Transaction Name],Description from fn_dblog(null,null)

     

     

        

        

     

     

        所以当你并发过高且频繁创建删除临时表的时候就会造成大量的争用。

     

    展开全文
  • 方法如下:1、下载“微信定位精灵”软件,安装;2、按图示设置如下,然后缩小地图,把光标定位在大马或任意地方,点击左上角的圆形定位按键完成定位,点右上角的菜单栏,选择“启动微信”,接下来的正常操作就行了。...
  • 主要介绍了javascript实现网页字符定位的方法,实例分析了javascript页面元素查找定位的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 主要介绍了Python 如何定位特定类型文件,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
  • 哈希表查找——成功和不成功时的平均查找长度

    万次阅读 多人点赞 2017-09-17 13:27:21
    哈希表查找——成功和不成功时的平均查找长度 以下求解过程是按照“计算机统考的计算方法”,不同的老师、教材在“处理冲突”上可能会有不同的方法,所以最主要的是掌握原理即可,对于考研的朋友最好掌握统考...
  • Hash查找算法

    千次阅读 2018-09-05 14:53:03
    哈希查找,也称为散列查找(本文以哈希称呼)。提起哈希,我的第一印象就是C#中的Hashtable类,它是由一组key/value的键值对组成的集合,它就是应用了散列技术。 那么,什么是哈希查找呢?在弄清楚什么是哈希查找之前...
  • 地图定位开发

    千次阅读 2015-02-03 10:13:01
    iOS开发系列--地图与定位 概览 ...例如你到了一个陌生的地方想要查找附近的酒店、超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品。总之,目前地
  • 有兴趣的朋友可以测试下 //打开app Application:///D|/PbObjFind/pbobjfind.pbl&action=open&entry=pbobjfind //打开dw DataWindow:///D|/PbObjFind/pbobjfind.pbl&action=open&entry=d_recentpbw //打开中文...
  • 定位别人手机具体位置(如何用手机号锁定一个人的位置)相信大家...▷第二步打开iPhone自带软件“查找朋友”,点击“定位别人手机具体位置(如何用手机号锁定一个人的位置)相信大家很少使用到iPhone的定位追踪功能,但...
  • 主要介绍了java实现查找PDF关键字所在页码及其坐标的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 微信怎么定位对方的手机所在位置(偷偷定位微信好友位置)春天来了,人们都喜欢...我们使用这个功能,就可以快速找到对方了,还不知道的朋友,下面就跟着我一起来看一下吧。一、发送位置微信怎么定位对方的手机所在位...
  • 现在想象这样一个场景:朋友请你去KFC吃炸鸡汉堡, 而KFC在城市的各个区都有的,所以你要先确定是哪个区哪个街道的KFC,根据位置属性从大到小逐级查找,这是符合逻辑的查找思路。在这个场景里,因目标...
  • linux find 查找文件

    千次阅读 2021-02-23 15:02:28
    在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。  可是使用Linux的用户就没有...
  • 主要介绍了C#实现txt定位指定行的方法,涉及C#针对文本文件进行光标定位的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 主要介绍了Shell脚本实现查找字符串中某字符最后出现的位置,本文给出了Shell脚本和C语言程序的实现代码,需要的朋友可以参考下
  • 社会工程学之ip获取和定位

    千次阅读 2020-08-31 22:48:24
    社会工程学之ip获取和定位IP地址获取ThreatScan在线扫描工具基础信息扫描端口扫描旁站扫描信息泄露查询IP物理定位方法Python查询经纬度网站定位位置安全建议手机查找 IP地址获取 IP地址获取非常简单,有很多网站和...
  • 主要介绍了python实现ip地址查询经纬度定位详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 话不多说,直接进入主题吧通过XPATH选择器查找 在我们的测试自动化代码中,我们通常更喜欢使用id,名称,类等这些定位符。但是,有时我们在DOM中找不到它们中的任何一个,而且有时...
  • 主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以参考下
  • 这篇文章主要介绍了微信小程序基于高德地图查找位置并显示文字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.根据经纬度在 地图上查找定位  var key = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,266
精华内容 14,106
关键字:

下载查找朋友定位