導航:首頁 > 操作系統 > straceandroid

straceandroid

發布時間:2022-08-26 09:30:33

⑴ windows,linux,unix系統有什麼區別為什麼說黑客偏愛linux

2003年6月,一些計算機黑客舉行了一次「篡改者挑戰賽」,目標是在6小時內篡改6000個網站的頁面。根據所攻破的操作系統的不同為參與者計分。採用Windows系統的網站計1分,UNIX或Linux,3分。也就是說,他們認為UNIX和linux比較難以攻破。

一、 理解誤區:
誤區一:linux比windows更容易被攻擊
有人任務Linux的代碼完全開放,也就是說,何人都能得到UNIX和Linux中的「透明代碼」——包括黑客、心懷不滿的員工和競爭對手——而Windows的代碼是收到嚴格保護的知識產權,那麼UNIX和Linux就應該比Windows更容易受到攻擊了,對吧?

「不對,」Justin Steinman,Novell北美區經理說,「和Windows所謂『以隱匿求安全』相比,Linux的『以透明求安全』更為安全。因為整個Linux團體都在完善和關注其代碼。一旦有人發現安全漏洞,人們就會對它進行修補,並把補丁程序發布給整個團隊。」

Steinman把這種響應速度和微軟的「補丁星期二」做了對比。微軟每個月的的第二個星期二發布Windows操作系統和其他應用軟體的補丁程序。「如果你在第二個星期三發現了漏洞呢?你得等上30天才能得到補丁程序。」他說。
誤區二:大多數Windows能乾的事Linux幹不了
像我們日常用的一些QQ,暴風影音,Word在Linux上都能使用,相對一些更加專業話的軟體Linux更是一個先驅者,比如 Matlab, Mathematica, AutoCAD, Candence的,Synopsys的,Avant!的......全都是先有 UNIX的版本(包括Linux),然後再考慮移植給Windows,甚至根本不移植給 Windows,因為 Windows的機器一般沒有足夠的能力運行這樣的程序。
誤區三:IDE
有些人在抱怨為什麼 Linux沒有一個良好的 IDE開發環境。Linux現在已經有一些 IDE了,但是總是有很多問題。你是不是正在尋找,正在期望 Linux某一天可以有一個VC那樣的開發環境?你有沒有發現你正在進入微軟給你設下的怪圈?你為什麼一定要用 IDE?你說:"IDE開發迅速,調試方便,適合大型程序......"那說明微軟的程序在我們的腦子里已經比較根深蒂固,真的是時候需要好好清醒一下了。
看看大型的 UNIX程序,包括 Linux內核,各種網路服務程序,Xwindow程序在內,哪一個是 IDE搞出來的?還有Candence, Synopsys,Mentor的高性能的圖形界面 EDA程序也都不是 IDE寫的。微軟的人在寫 Windows本身的時候也根本不用 IDE!
有的時候,我們甚至將"編輯器"和"編譯器"都搞混淆了!一個窗口裡輸入了代碼,點擊一個按鈕就可以編譯程序,但是這裡面到底是怎麼工作的,不知道!我們被蓋在上面的窗口擋住了視線,甚至會以為那個按鈕就是編譯器!一個 IDE 集成了編輯器,編譯器,匯編器,調試器,跟蹤器......這個編輯器功能肯定比不上 VIM或 Emacs,編譯器比不上 GCC,匯編器比不上 as,調試器比不上 gdb, ddd,跟蹤器比不上 strace, ltrace, truss。最後我們得到的是一套整合的很好的低能的程序。
而在 UNIX下就不一樣了。你可以用你最喜歡的 VIM編輯程序,你在 VIM里可以調用 GNU make,make可以調用 gcc, ld, ...實際上 make能幫你很多忙。make的出錯信息可以被 VIM捕獲,VIM能幫你在源程序里定位。你如果喜歡 icc,你可以讓 make用 icc而不是 gcc。你如果覺得 gdb跟蹤變數時比較麻煩,你可以用 ddd來顯示各種數據結構之間的關系。你還可以在 Emacs里調用 gdb,那樣就可以同步顯示源代碼了。而且 VIM和 Emacs還可以編輯很多其它東西,比如信件,LaTeX文檔,HTML,配置文件......你不用另外找一個什麼編輯器來干這些雜活了。很多程序比如 Mutt, tin都可以在內部使用 VIM,這樣就更方便了。

二、安全性方面
1許可權方面:
Quandt指出,Linux和UNIX在架構中採用了「最少特權」概念。她把提供某些門的專用鑰匙與提供能打開所有房門的萬能鑰匙做了比較。在Linux 2.6中,安全架構比以前的版本有了很大改善,支持最少特權,具有以角色為基礎的接近權控制,用戶只進入他們需要使用的那部分系統即可。
2 用戶結構方面:
多用戶設計假定用戶較多,但坦白講,對他們信任較少。簡單來說,Windows把用戶程序和操作系統的核心集成到一起,而Linux和UNIX則把核心區域與用戶區域區分開來。
「這是固有的安全。」 Sun公司Solaris Security經理Mark Thacker說,「UNIX從最開始就是多用戶系統,不是逐漸演變為伺服器操作系統的台式機系統。UNIX一直都是把用戶領域和核心領域分開的,這是任何源於DOS的操作系統所不具備的。」
3運行狀況方面:
可以裸奔(無需殺毒軟體,反廣告/間諜防護軟體),甚至可以數月不用重啟機器,因為它具有獨特的內存管理方式。(大家可以想一下如果windows下裸奔會是怎樣的後果;windows如果很長一段時間不關機或是重啟,那麼它運行肯定不會有剛開機時那麼流暢),所以說安全上Linux與windows比較沒意思。

二、 技術特點分析
這一方面就更加沒有意思了,甚至可以誇張的一點描述UNIX/Linux可以將Windows秒出十萬八千里。
1 內存機制方面
Linux有比 Windows先進的磁碟緩沖技術。你有沒有發現你往硬碟寫數據的時候,很快就完成了?那是因為 Linux在內存里有很多磁碟緩沖區,你要寫到硬碟上的數據先被寫到了這些內存里。在一定的間隔時間後,Linux才把數據寫回硬碟,這樣不但高效,避免了多次硬碟操作,而且減少了文件的不連續,也就是減少了"碎片"。Windows當然也有磁碟緩沖,但是由於它內存管理的低效率,它不敢把大量內存都用來作為磁碟緩沖,因為它沒有能力在用的時候隨時把內存收回來。
2與硬體結合性
由於開放源代碼的特點LINUX得到AMD和INTEL公司的關注。因為這兩家公司都希望在64位晶元時代能夠和開放源代碼的操作系統系統緊密聯系LINUX的發展速度急快,從它的內核就可以看出。LINUX比其他操作系統更能適應晶元技術發展。
3並行化多任務處理
Linux系統調度每一個進程平等地訪問微處理器。由於CPU的處理速度非常快,其結果是,啟動的應用程序看起來好像在並行運行。事實上,從處理器執行一個應用程序中的一組指令到Linux調度微處理器再次運行這個程序之間只有很短的時間延遲,用戶是感覺不出來的。
經過對最重量級的資料庫Oracle 9i測試,在LINUX下的運行速度比在WIN2003 SERVER要快25%。這一篇,LINUX佔了上風。每次oracle發布新版資料庫的時候,都是會最先發布Linux版本的,而Windows版本的至少要半年以後才發布,深入理解後認為從底層來說倆個版本簡直就是2種軟體,雖然提供相同的功能。
4網路信息化
Linux的組網能力非常強大,它的TCP/IP代碼是最高級的。Linux提供了對於當前的TCP/IP協議的完全支持,並且包括了對下一代Internet。協議Ipv6的支持。Linux內核還包括了IP防火牆代碼、IP防偽、IP服務質量控制及許多安全特性。這些特性可以和像Cisco這樣的公司提供的高端路由設備的特性相媲美。此外,利用Redhat Linux提供的Samba組(並不是RedHat Linux獨有),Linux可以作為Windows客戶機的列印和文件伺服器,還可以用做NT的文件和列印伺服器。運用Linux包含的AppleTalk模塊,Linux甚至可以作為一個Macintosh客戶機的文件和列印伺服器。

三市場方面
1開源性方面:
楊元慶:「Windows不開源嚴重製約了IT產業發展」,開放源代碼是大勢所趨,Linux前途廣闊。互聯網免費的今天,開源性的事物將勢必會有更強的生存能力。

2 PC市場方向
全球PC市場出現了歷史上最嚴重的滑坡趨勢下,雖然在Window8的強烈攻勢下,消費者顯得無動於衷,依然轉向了智能手機和平板電腦。在如今android和iOS占據大半江山的背景下,windowsphone的前景愈發暗淡。顯然微軟在移動終端高速發展的今天,windows操作系統存在天然的弱勢。

3 費用問題
很多Linux版本是不需要花錢的,恰恰相反,Windows每個版本的安裝都是需要另付費用的。

⑵ Linux是干什麼用的

Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。

Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU工程各種工具和資料庫的操作系統。

(2)straceandroid擴展閱讀:

Linux操作系統的主要特性;

1、完全免費並且開放

Linux是一款免費的操作系統,用戶可以通過網路或其他途徑免費獲得,並可以任意修改其源代碼。這是其他的操作系統所做不到的。

2、完全兼容POSIX1.0標准

這使得可以在Linux下通過相應的模擬器運行常見的DOS、Windows的程序。這為用戶從Windows轉到Linux奠定了基礎。

3、多用戶、多任務

Linux支持多用戶,各個用戶對於自己的文件設備有自己特殊的權利,保證了各用戶之間互不影響。多任務則是現在電腦最主要的一個特點,Linux可以使多個程序同時並獨立地運行。

⑶ 怎樣提高android啟動速度

首先看一下Android系統的啟動流程:
bootloader
引導程序
kernel
內核
init
init初始化(這個大家都比較熟悉了,不要多說)
loads several daemons and services, including zygote
see /init.rc and init.<platform>.rc
zygote

這個是佔用時間最多的,重點修理對象
preloads classes
裝載了一千多個類,媽呀!!!
starts package manager 掃描package(下面詳細介紹)
service manager
start services (啟動多個服務)
從實際的測試數據來看,有兩個地方時最耗時間的,一個是zygote的裝載一千多個類和初始化堆棧的過程,用了20秒左右。另一個是掃描
/system/app,
/system/framework,
/data/app,
/data/app-private.
這幾個目錄下面的package用了大概10秒,所以我們重點能夠修理的就是這兩個老大的。
一、首先是調試工具的使用,可以測試哪些類和那些過程佔用了多少時間,
主要工具為
stopwatch
Message loggers
grabserial
printk times
logcat
Android自帶
bootchart
strace
AOSP的一部分(Eclair及以上版本)
使用例子
在init.rc中為了調試zygote

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server改為
service zygote /system/xbin/strace -tt -o/data/boot.strace /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

method tracer*
ftrace*
詳細使用可看提供的文檔和網頁介紹
上面的工具如果不用詳細的分析不一定都用到,也可以使用logcat就可以,在代碼中加一點計算時間和一些類的調試信息也可以達到很好效果。
二、zygote 裝載1千多個類
首先,我們可以添加一點調試信息,以獲得具體轉載情況。
diff --git a/core/java/com/Android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 404c513..f2b573c 100644
--- a/core/java/com/Android/internal/os/ZygoteInit.java
+++ b/core/java/com/Android/internal/os/ZygoteInit.java
@@ -259,6 +259,8 @@ public class ZygoteInit {
} else {
Log.i(TAG, "Preloading classes...");
long startTime = SystemClock.uptimeMillis();
+ long lastTime = SystemClock.uptimeMillis();
+ long nextTime = SystemClock.uptimeMillis();

// Drop root perms while running static initializers.
setEffectiveGroup(UNPRIVILEGED_GID);
@@ -292,12 +294,24 @@ public class ZygoteInit {
if (Config.LOGV) {
Log.v(TAG, "Preloading " + line + "...");
}
+ //if (count%5==0) {
+ // Log.v(TAG, "Preloading " + line + "...");
+ //}
+ Log.v(TAG, "Preloading " + line + "...");
Class.forName(line);
+ nextTime = SystemClock.uptimeMillis();
+ if (nextTime-lastTime >50) {
+ Log.i(TAG, "Preloading " + line + "... took " + (nextTime-lastTime) + "ms.");
+ }
+ lastTime = nextTime;
+
if (Debug.getGlobalAllocSize() > PRELOAD_GC_THRESHOLD) {
if (Config.LOGV) {
Log.v(TAG,
" GC at " + Debug.getGlobalAllocSize());
}
+ Log.i(TAG,
+ " GC at " + Debug.getGlobalAllocSize());
runtime.gcSoftReferences();
runtime.runFinalizationSync();
Debug.resetGlobalAllocSize();
上面+代表添加的代碼,這樣就可以很容易的得到在裝載類的過程中具體裝載了哪些類,耗費了多久。具體裝載的類在文件platform/frameworks/base/ preloaded-classes
內容類似:
Android.R$styleable
Android.accounts.AccountMonitor
Android.accounts.AccountMonitor$AccountUpdater
Android.app.Activity
Android.app.ActivityGroup
Android.app.ActivityManager$MemoryInfo$1
Android.app.ActivityManagerNative
Android.app.ActivityManagerProxy
Android.app.ActivityThread
Android.app.ActivityThread$ActivityRecord
Android.app.ActivityThread$AppBindData
Android.app.ActivityThread$ApplicationThread
Android.app.ActivityThread$ContextCleanupInfo
Android.app.ActivityThread$GcIdler
Android.app.ActivityThread$H
Android.app.ActivityThread$Idler
而這個文件是由文件WritePreloadedClassFile.java中的WritePreloadedClassFile類自動生成
/**

* Writes /frameworks/base/preloaded-classes. Also updates

* {@link LoadedClass#preloaded} fields and writes over compiled log file.

*/
public class WritePreloadedClassFile
/**
* Preload any class that take longer to load than MIN_LOAD_TIME_MICROS us.
*/
static final int MIN_LOAD_TIME_MICROS = 1250;//這個代表了裝載時間小於1250us即1.25ms的類將不予裝載,也許可以改這個參數減少一下類的裝載

//這里可以看到什麼樣的類會被裝載

A:啟動必須裝載的類,比如系統級的類

B:剛才說的裝載時間大於1.25ms的類

C:被使用一次以上或被應用裝載的類
仔細看看篩選類的具體實現,可以幫助我們認識哪些類比較重要,哪些可以去掉。
篩選規則是
第一 isPreloadable,
/**Reports if the given class should be preloaded. */
public static boolean isPreloadable(LoadedClass clazz) {
return clazz.systemClass && !EXCLUDED_CLASSES.contains(clazz.name);
}
意思是指除了EXCLUDED_CLASSES包含的類之外的所有系統裝載的類。
EXCLUDED_CLASSES包含
/**
* Classes which we shouldn't load from the Zygote.
*/
private static final Set<String> EXCLUDED_CLASSES
= new HashSet<String>(Arrays.asList(
// Binders
"Android.app.AlarmManager",
"Android.app.SearchManager",
"Android.os.FileObserver",
"com.Android.server.PackageManagerService$AppDirObserver",
// Threads
"Android.os.AsyncTask",
"Android.pim.ContactsAsyncHelper",
"java.lang.ProcessManager"
));
目前是跟Binders跟Threads有關的不會被預裝載。

第二 clazz.medianTimeMicros() > MIN_LOAD_TIME_MICROS裝載時間大於1.25ms。
第三 names.size() > 1 ,既是被processes一次以上的。
上面的都是指的system class,另外還有一些application class需要被裝載
規則是fromZygote而且不是服務
proc.fromZygote() && !Policy.isService(proc.name)

fromZygote指的除了com.Android.development的zygote類
public boolean fromZygote() {
return parent != null && parent.name.equals("zygote")
&& !name.equals("com.Android.development");
}

/除了常駐內存的服務

/**
* Long running services. These are restricted in their contribution to the
* preloader because their launch time is less critical.
*/
// TODO: Generate this automatically from package manager.
private static final Set<String> SERVICES = new HashSet<String>(Arrays.asList(
"system_server",
"com.google.process.content",
"Android.process.media",
"com.Android.bluetooth",
"com.Android.calendar",
"com.Android.inputmethod.latin",
"com.Android.phone",
"com.google.Android.apps.maps.FriendService", // pre froyo
"com.google.Android.apps.maps:FriendService", // froyo
"com.google.Android.apps.maps.LocationFriendService",
"com.google.Android.deskclock",
"com.google.process.gapps",
"Android.tts"
));
好了。要轉載的就是這些類了。雖然preloaded- classes是在下載源碼的時候已經確定了的,也就是對我們來說WritePreloadedClassFile類是沒用到的,我們可以做的就是在 preloaded-classes文件中,把不預裝載的類去掉,試了把所有類去掉,啟動確實很快跳過那個地方,但是啟動HOME的時候就會很慢了。所以最好的方法就是只去掉那些沒怎麼用到的,不過要小心處理。至於該去掉哪些,還在摸索,稍後跟大家分享。有興趣的朋友可以先把preloaded- classes這個文件裡面全部清空,啟動快了很多,但在啟動apk的時候會慢了點。當然了,也可以把Android相關的類全部去掉,剩下java的類,試過了也是可以提高速度。
三,系統服務初始化和package 掃描

在啟動系統服務的init2()時會啟動應用層(Java層)的所有服務。
public static void main(String[] args) {

System.loadLibrary("Android_servers");
init1(args); //init1 初始化,完成之後會回調init2()
}

在init2()中會啟動一個線程來啟動所有服務
public static final void init2() {
Log.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("Android.server.ServerThread");
thr.start();
}

class ServerThread extends Thread {
。。。
public void run() {
。。。
關鍵服務:
ServiceManager.addService("entropy", new EntropyService());
ServiceManager.addService(Context.POWER_SERVICE, power);
context = ActivityManagerService.main(factoryTest);
ServiceManager.addService("telephony.registry", new TelephonyRegistry(context));

PackageManagerService.main(context,
factoryTest != SystemServer.FACTORY_TEST_OFF);//apk掃描的服務
ServiceManager.addService(Context.ACCOUNT_SERVICE,
new AccountManagerService(context));
ContentService.main(context,
factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL);
battery = new BatteryService(context);
ServiceManager.addService("battery", battery);

hardware = new HardwareService(context);
ServiceManager.addService("hardware", hardware);
AlarmManagerService alarm = new AlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE, alarm);
ServiceManager.addService(Context.SENSOR_SERVICE, new SensorService(context));

WindowManagerService.main(context, power,
factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);

⑷ c語言如何將函數調用堆棧列印出來

可以直接用輸出在函數內部調用時,把調用順序列印出來。

一、一個由C/C++編譯的程序佔用的內存分為以下幾個部分

1、棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。

2、堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。

3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。-程序結束後有系統釋放

4、文字常量區—常量字元串就是放在這里的。程序結束後由系統釋放

5、程序代碼區—存放函數體的二進制代碼。


二、常式:

//main.cpp
inta=0;全局初始化區
char*p1;全局未初始化區
main()
{
intb;棧
chars[]="abc";棧
char*p2;棧
char*p3="123456";123456在常量區,p3在棧上。
staticintc=0;全局(靜態)初始化區
p1=(char*)malloc(10);
p2=(char*)malloc(20);
分配得來得10和20位元組的區域就在堆區。
strcpy(p1,"123456");123456放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

php swoole 只能運行在php-cli 環境嗎

一直想寫點Swoole的東西,畢竟它重新定義了php,卻一直不知道怎麼下手寫Swoole涉及的知識點非常多,互為表裡,每次想寫都發現根本理不出一個頭緒Swoole是一個php的擴展,它的核心目的就是解決php在實現server服務中可能遇到的一系列問題,這些問題用源生的php往往並不能很高效(執行效率)的解決,一般也不會使用php來解決,所以會有說swolle重新定義的php的說法。
其實swoole也提供了一個框架,swoole framework是基於swoole extension設計的一個框架,要用好這個框架,還是要先了解swoole extension。
擴展的英文名稱是Extension,php擴展是用C語言作為開發語言,基於Zend引擎提供的API,編譯成的一個動態庫。
如果曾經做過類似動態庫調用開發的童鞋可能會更好理解一些,例如Android中的NDK開發在php的配置文件中配置好extension的屬性後,就可以引用這個動態庫了。
也就是說,swoole本身是用C語言編寫的,它可以讓php獲得一些額外的function。
然後是運行方式,swoole的許多功能都只能運行在cli模式下,而cli模式往往是很多剛接觸swoole的phper遇到的第一個問題。
有時候其實只是需要轉變一下思路
我們現在整理一下最常見的php代碼執行方式:
安裝apache、php
配置apache對那個目錄進行php解析
用瀏覽器訪問那個目錄的php文件
更多的細節這里就不提了,畢竟我相信每個phper對這個都是很熟悉的。
但這里就開始出現了第一個問題,我們知道,php是一個腳本語言,腳本語言的核心特點在於不用編譯,隨時執行,而執行腳本的工具就是解析器,而php的解析器就是zend引擎。
嚴格來說,zend並不是唯一的選擇,不過,zend是最官方的。另外,Zend Studio和Zend Engine不是同一個東西,本文中的Zend全部指Zend Engine。
換個角度講,只要有解析器,寫好的php腳本就是可以執行的,而zend引擎與apache之間並沒有絕對的關系實際上,apahce是調用了zend對php腳本進行執行,然後將執行結果輸出給了瀏覽器所以所謂cli模式(CommandLine,命令行模式),其實就是在命令行下直接調用zend引擎對php腳本進行解析並執行,並獲得程序輸出結果的php腳本執行方式。
其實php也可以作為shell腳本來使用哦,就像bash shell一樣既然問題講清楚了,在一個系統中具體怎麼操作呢?
本文以CentOS 7.5作為系統環境,swoole是針對linux系統開發的,windows下並不適用。學習swoole的一個前題是懂得基本的linux系統使用。
當安裝好php的時候,找到php的安裝目錄,如果是默認安裝的話,可以試試whereis命令# 某種簡單的方法
whereis php
> /usr/local/bin/php;
locate whereis find這些命令都可以試試,目的是找到php然後我們來寫一個最經典的php腳本:
<?php
//vi hello_cli.php
echo 'Hello PHP Cli';
編寫純php腳本時,php標簽不要封口
然後我們在shell里執行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
這段代碼中的第一個php,是一個可執行文件,它接受一個php腳本文件作為輸入參數,並解析執行這個php腳本文件(通過zend)。
沒有錯,第一個cli模式下的php程序就被你執行成功了!
默認情況下,php都會被安裝在了$PATH的目錄下,那就可以直接省略路徑前綴了,下文中調用php的時候,全都省略了路徑前綴。
因為swoole是pecl的項目,所以使用pecl安裝是最簡單的方法,強烈推薦第一次接觸的童鞋先使用pecl安裝,在熟悉了swoole之後,再考慮使用編譯安裝的方式以獲取更多進階功能。
pecl這個工具基本都會被安裝在與php相同的目錄下(往往也都是$PATH目錄)pecl install swoole
執行以下命令查看是否安裝成功:
php -m | grep swoole
> swoole
如果正確的輸出了swoole,那麼恭喜你,這次安裝很成功另一個常見的比較麻煩的問題是,有些童鞋的電腦里安裝了多個php,而安裝的時候沒有正確的安裝到預期的php的擴展目錄中,就會導致無法正常工作,解決方案就是弄清楚各個php安裝目錄及配置關系,選擇正確的目錄進行安裝。
其實本文還沒正式開始介紹swoole,都是在學習swoole之前的准備工作,swoole的上手門檻比一般的php應用要高的多,如果沒有網路開發和操作系統方面的一些知識,學習它並不是一件容易的事情,學習曲線很陡峭。
這句話我在群里說了無數次
很多新手會詬病swoole的手冊寫的太模糊,其實是前置知識不足,而手冊也給出了需要的前置知識列表,以下引用至官網的手冊-學習swoole需要哪些知識?
多進程/多線程
了解Linux操作系統進程和線程的概念
了解Linux進程/線程切換調度的基本知識
了解進程間通信的基本知識,如管道、UnixSocket、消息隊列、共享內存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收緩存區、發送緩存區、阻塞/非阻塞、超時等概念IO復用
了解select/poll/epoll
了解基於select/epoll實現的事件循環,Reactor模型了解可讀事件、可寫事件
TCP/IP網路協議
了解TCP/IP協議
了解TCP、UDP傳輸協議
調試工具
使用gdb調試Linux程序
使用strace跟蹤進程的系統調用
使用tcpmp跟蹤網路通信過程
其他Linux系統工具,如ps、lsof、top、vmstat、netstat、sar、ss等學習並理解一個新事務並不是一個容易的事情,特別對於swoole這種具備一定顛覆性的工具,要有耐心和實踐。
淡定的把手冊看完,遇到不理解的名詞學會使用搜索引擎學習,swoole的手冊其實是個大寶庫,網路開發常見的問題其實里邊都涉及到了。

⑹ Linux主要是干什麼用的

主要是用於後端伺服器操作系統

Linux是一種自由和開放源碼的類UNIX操作系統。它能運行主要的Unix工具軟體、應用程序和網路協議,支持32位和64位硬體。該操作系統的內核由林納斯·托瓦茲於1991年10月5日首次發布。

Linux最初是作為支持英特爾x86架構的個人計算機的一個自由操作系統,現可運行在伺服器和其他大型平台之上,如大型計算機和超級計算機。Linux也廣泛應用在嵌入式系統上,如手機(Mobile Phone)、平板電腦(Tablet)、路由器(Router)、電視(TV)和電子游戲機等。



(6)straceandroid擴展閱讀:

2001年1月,Linux 2.4發布,它進一步地提升了SMP系統的擴展性,同時它也集成了很多用於支持桌面系統的特性:USB,PC卡(PCMCIA)的支持,內置的即插即用,等等功能。

2003年12月,Linux 2.6版內核發布,相對於2.4版內核2.6在對系統的支持都有很大的變化。

2004年的第1月,SuSE嫁到了Novell,SCO繼續頂著罵名四處強行「化緣」, Asianux, MandrakeSoft也在五年中首次宣布季度贏利。3月,SGI宣布成功實現了Linux操作系統支持256個Itanium 2處理器。


⑺ 精通android游戲開發的目錄

第1章 歡迎進入android游戲世界 1
1.1 必備技能 1
1.1.1 扎實的android基礎 1
1.1.2 linux和shell腳本的基本知識 3
1.2 需要哪些軟體工具 3
1.3 建立環境 4
1.3.1 獲得android源文件 4
1.3.2 提取本地android庫 6
1.3.3 為arm處理器安裝gnu工具鏈 8
1.3.4 編寫定製編譯腳本 10
1.4 建立開發環境 17
1.5 已經成功邁出第一步 22
第2章 在android中編譯本地代碼 23
2.1 第一個本地android應用 23
2.1.1 創建avd 23
2.1.2 創建android項目 26
2.1.3 應用體系結構 27
2.2 編譯和測試共享庫 38
2.2.1 缺少符號時的調試 40
2.2.2 在設備上測試動態庫 41
.2.2.3 用strace調試 42
2.2.4 靜態編譯 43
2.3 測試本地應用 44
2.4 下一章內容 46
第3章 從頭構建java游戲 47
3.1 android游戲與java me游戲 47
3.2 創建你的第一個java游戲——space blaster 48
3.2.1 了解游戲的體系結構 49
3.2.2 創建項目 50
3.2.3 創建游戲的活動類 51
3.2.4 創建游戲布局 53
3.2.5 實現游戲 58
3.2.6 處理按鍵和觸控事件 66
3.3 在模擬器上測試 69
3.4 下一章內容 70
第4章 java游戲續篇:多邊形的樂趣 71
4.1 關於本章安排 71
4.2 了解在android中繪制多邊形的問題 71
4.3 了解繪制矩形的問題 73
4.4 為asteroids創建一個polygon類 75
4.5 為asteroids創建polygonsprite類 80
4.6 游戲的體系結構 84
4.7 創建項目 84
4.7.1 創建游戲布局 85
4.7.2 查看資源 86
4.7.3 了解游戲生命期 87
4.7.4 響應按鍵和觸控事件 97
4.8 在模擬器上測試asteroids 100
4.9 下一章內容 101
第5章 opengl 3d圖形與jni混合 102
5.1 移動設備的強大能力 103
5.2 在java中使用opengl 104
5.2.1 java主活動 106
5.2.2 表面視圖 108
5.2.3 gl線程 110
5.2.4 立方體渲染器 113
5.2.5 cube類 116
5.3 以本地方式使用opengl 118
5.3.1 主活動 120
5.3.2 本地介面類 122
5.3.3 對原示例的修改 123
5.3.4 本地立方體渲染器 124
5.3.5 本地立方體 131
5.3.6 編譯和運行示例 132
5.4 opengl游戲移植到android的問題 137
5.5 大幕已經拉開 138
第6章 3d射擊游戲Ⅰ:面向android的wolfenstein 3d 139
6.1 收集工具 139
6.2 wolf 3d 140
6.3 游戲體系結構 143
6.4 wolf 3d的java類 144
6.4.1 創建主要的wolflauncher類 145
6.4.2 創建wolf 3d主菜單 149
6.4.3 處理按鍵和觸控事件 150
6.4.4 創建游戲循環 152
6.4.5 建立本地回調 153
6.4.6 創建聲音和音樂處理器 155
6.4.7 創建運動控制器處理程序 156
6.4.8 創建運動控制器 158
6.4.9 聲音類 165
6.4.10 本地介面類 174
6.5 編寫本地層 176
6.5.1 初始化游戲循環 177
6.5.2 用c到java的回調級聯傳遞消息 179
6.6 編譯本地庫 185
6.6.1 編寫makefile 186
6.6.2 生成jni頭文件 187
6.7 在模擬器中測試wolf 3d 187
6.8 下一章內容 189
第7章 3d射擊游戲Ⅱ:面向android的doom 191
7.1 java/c組合的無限潛能 191
7.2 將doom引入移動設備 192
7.3 doom的游戲體系結構 194
7.4 java主活動 195
7.4.1 創建處理器 196
7.4.2 游戲布局 197
7.4.3 菜單和選擇處理器 199
7.4.4 按鍵和觸控事件處理器 200
7.4.5 本地回調處理器 202
7.4.6 導航控制項 205
7.5 音頻類 207
7.6 本地介面類 208
7.6.1 回調監聽器 208
7.6.2 本地方法 209
7.6.3 c到java的回調 209
7.7 本地層 212
7.7.1 本地方法實現 212
7.7.2 對原游戲的修改 223
7.8 doom庫(dso)編譯 229
7.9 在模擬器中測試面向android的doom 230
7.10 大功告成 232
附錄 部署與編譯提示 234

⑻ 學Linux有什麼用

1、linux是開放源代碼的操作系統,它的每一個操作,你都能夠充分了解,並且可以按照你的想法加以修改,這對一個計算機學生或者計算機愛好者來說,無疑是有很大幫助的,它可以讓你知道系統是怎樣工作。

2、 其次是Linux系統是由C語言寫成的,對深入了解和學習C語言的同學無疑是最適合的環境,Linux下使用VI編輯器,讓你編碼顯得高大上,同時VI也是一個讓人愛不釋手的好工具;Linux里強大的GCC套件,讓你隨心所欲編譯C程序,出色的GDB調試工具,直接讓你領悟C語言的原理。

3、據說世界上百分九十以上的伺服器都是運行在類Linux系統上,也就是說你日常生活中所有的網路服務,其實都是基於Linux系統的,學好了Linux,你就可以通過管理伺服器或者破壞伺服器。

(8)straceandroid擴展閱讀

Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。

它能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。

Linux操作系統誕生於1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。

嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU工程各種工具和資料庫的操作系統。

⑼ Android studio 開發app,如何抵抗動態調試,反調試代碼怎麼寫請寫上詳細代碼。

為了保護關鍵代碼被逆向分析,一般放在應用程序初始化過程中,如init_array,或jni_onload函數里進行檢查代碼執行。
1.調試檢測
對調試器的檢測(ida,gdb,strace, ltrace等調試工具)
a.父進程檢測
b.當前運行進程檢測
例如對android_server進程檢測。針對這種檢測只需將android_server改名就可繞過
[objc] view plain
pid_t GetPidByName(const charchar *as_name) {
DIR *pdir = NULL;
struct dirent *pde = NULL;
FILEFILE *pf = NULL;
char buff[128];
pid_t pid;
char szName[128];
// 遍歷/proc目錄下所有pid目錄
pdir = opendir("/proc");
if (!pdir) {
perror("open /proc fail.\n");
return -1;
}
while ((pde = readdir(pdir))) {
if ((pde->d_name[0] < '0') || (pde->d_name[0] > '9')) {
continue;
}
sprintf(buff, "/proc/%s/status", pde->d_name);
pf = fopen(buff, "r");
if (pf) {
fgets(buff, sizeof(buff), pf);
fclose(pf);
sscanf(buff, "%*s %s", szName);
pid = atoi(pde->d_name);
if (strcmp(szName, as_name) == 0) {
closedir(pdir);
return pid;
}
}
}
closedir(pdir);
return 0;
}
c.讀取進程狀態(/proc/pid/status)
State屬性值T 表示調試狀態,TracerPid 屬性值正在調試此進程的pid,在非調試情況下State為S或R, TracerPid等於0

d.讀取 /proc/%d/wchan
下圖中第一個紅色框值為非調試狀態值,第二個紅色框值為調試狀態:

[objc] view plain
static void get_process_status(pid_t pid,const char* info,charchar *outline)
{
FILEFILE *fp;
char filename;
char line = {0};
snprintf( filename, sizeof(filename), "/proc/%d/status", pid );
fp = fopen( filename, "r" );
if ( fp != NULL )
{
while ( fgets( line, sizeof(line), fp ) )
{
if ( strstr( line, info ) )
strcpy(outline,line);
}
fclose( fp ) ;
}
return ;
}
static int getProcessStatus(int pid)
{
char readline = {0};
int result = STATUS_ELSE;
get_process_status(pid,"State",readline);
if(strstr(readline,"R"))
result = STATUS_RUNNING;
else if(strstr(readline,"S"))
result = STATUS_SLEEPING;
else if(strstr(readline,"T"))
result = STATUS_TRACING;
return result;
}
static int getTracerPid(int pid)
{
char readline = {0};
int result = INVALID_PID;
get_process_status(pid,"TracerPid",readline);
charchar *pidnum = strstr(readline,":");
result = atoi(pidnum + 1);
return result;
}
static int getWchanStatus(int pid)
{
FILEFILE *fp= NULL;
char filename;
char wchaninfo = {0};
int result = WCHAN_ELSE;
char cmd = {0};
sprintf(cmd,"cat /proc/%d/wchan",pid);
LOGANTI("cmd= %s",cmd);
FILEFILE *ptr; if((ptr=popen(cmd, "r")) != NULL)
{
if(fgets(wchaninfo, 128, ptr) != NULL)
{
LOGANTI("wchaninfo= %s",wchaninfo);
}
}
if(strncasecmp(wchaninfo,"sys_epoll\0",strlen("sys_epoll\0")) == 0)
result = WCHAN_RUNNING;
else if(strncasecmp(wchaninfo,"ptrace_stop\0",strlen("ptrace_stop\0")) == 0)
result = WCHAN_TRACING;
return result;
}
e. ptrace 自身或者fork子進程相互ptrace
[objc] view plain
ptrace me
if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
printf("DEBUGGING... Bye\n");
return 1;
}
void anti_ptrace(void)
{
pid_t child;
child = fork();
if (child)
wait(NULL);
else {
pid_t parent = getppid();
if (ptrace(PTRACE_ATTACH, parent, 0, 0) < 0)
while(1);
sleep(1);
ptrace(PTRACE_DETACH, parent, 0, 0);
exit(0);
}
}
f. 防止mp
利用Inotify機制,對/proc/pid/mem和/proc/pid/pagemap文件進行監視。inotify API提供了監視文件系統的事件機制,可用於監視個體文件,或者監控目錄。具體原理可參考:http://man7.org/linux/man- pages/man7/inotify.7.html
偽代碼:
[objc] view plain
void __fastcall anitInotify(int flag)
{
MemorPagemap = flag;
charchar *pagemap = "/proc/%d/pagemap";
charchar *mem = "/proc/%d/mem";
pagemap_addr = (charchar *)malloc(0x100u);
mem_addr = (charchar *)malloc(0x100u);
ret = sprintf(pagemap_addr, &pagemap, pid_);
ret = sprintf(mem_addr, &mem, pid_);
if ( !MemorPagemap )
{
ret = pthread_create(&th, 0, (voidvoid *(*)(voidvoid *)) inotity_func, mem_addr);
if ( ret >= 0 )
ret = pthread_detach(th);
}
if ( MemorPagemap == 1 )
{
ret = pthread_create(&newthread, 0, (voidvoid *(*)(voidvoid *)) inotity_func, pagemap_addr);
if(ret > 0)
ret = pthread_detach(th);
}
}
void __fastcall __noreturn inotity_func(const charchar *inotity_file)
{
const charchar *name; // r4@1
signed int fd; // r8@1
bool flag; // zf@3
bool ret; // nf@3
ssize_t length; // r10@3
ssize_t i; // r9@7
fd_set readfds; // @2
char event; // @1
name = inotity_file;
memset(buffer, 0, 0x400u);
fd = inotify_init();
inotify_add_watch(fd, name, 0xFFFu);
while ( 1 )
{
do
{
memset(&readfds, 0, 0x80u);
}
while ( select(fd + 1, &readfds, 0, 0, 0) <= 0 );
length = read(fd, event, 0x400u);
flag = length == 0;
ret = length < 0;
if ( length >= 0 )
{
if ( !ret && !flag )
{
i = 0;
do
{
inotity_kill((int)&event);
i += *(_DWORD *)&event + 16;
}
while ( length > i );
}
}
else
{
while ( *(_DWORD *)_errno() == 4 )
{
length = read(fd, buffer, 0x400u);
flag = length == 0;
ret = length < 0;
if ( length >= 0 )
}
}
}
}
g. 對read做hook
因為一般的內存mp都會調用到read函數,所以對read做內存hook,檢測read數據是否在自己需要保護的空間來阻止mp
h. 設置單步調試陷阱
[objc] view plain
int handler()
{
return bsd_signal(5, 0);
}
int set_SIGTRAP()
{
int result;
bsd_signal(5, (int)handler);
result = raise(5);
return result;
}

⑽ android preload怎麼用

首先看一下Android系統的啟動流程:
bootloader
引導程序
kernel
內核
init
init初始化(這個大家都比較熟悉了,不要多說)
loads several daemons and services, including zygote
see /init.rc and init.<platform>.rc
zygote

這個是佔用時間最多的,重點修理對象
preloads classes
裝載了一千多個類,媽呀!!!
starts package manager 掃描package(下面詳細介紹)
service manager
start services (啟動多個服務)
從實際的測試數據來看,有兩個地方時最耗時間的,一個是zygote的裝載一千多個類和初始化堆棧的過程,用了20秒左右。另一個是掃描
/system/app,
/system/framework,
/data/app,
/data/app-private.
這幾個目錄下面的package用了大概10秒,所以我們重點能夠修理的就是這兩個老大的。
一、首先是調試工具的使用,可以測試哪些類和那些過程佔用了多少時間,
主要工具為
stopwatch
Message loggers
grabserial
printk times
logcat
Android自帶
bootchart
strace
AOSP的一部分(Eclair及以上版本)
使用例子
在init.rc中為了調試zygote

閱讀全文

與straceandroid相關的資料

熱點內容
pdf字體加深 瀏覽:204
怎麼做一個minecraft伺服器 瀏覽:769
c語言實現ls命令 瀏覽:663
小洋糕解壓視頻 瀏覽:450
域名內網訪問內網伺服器地址 瀏覽:138
我的世界伺服器如何摳掉金幣 瀏覽:223
域名與ip地址通過什麼伺服器查 瀏覽:95
企業網站需要什麼雲伺服器配置 瀏覽:909
遼事通伺服器出現錯誤是什麼原因 瀏覽:765
能否將一個表格的子表加密 瀏覽:63
手機ios微信收藏怎麼加密 瀏覽:593
安卓如何改黑色 瀏覽:330
oracle資料庫導出命令 瀏覽:696
用python做鍾表盤 瀏覽:873
腰椎壓縮性骨折吧 瀏覽:326
安卓怎麼把軟體改成火影忍者 瀏覽:704
手機如何切換軟體商店伺服器 瀏覽:325
江蘇省python二級題型 瀏覽:231
文件編譯器在哪 瀏覽:28
選擇目錄時此電腦的文件夾怎麼刪 瀏覽:25