當前位置:首頁 » 操作系統 » linux捕獲異常

linux捕獲異常

發布時間: 2022-05-23 03:12:03

Ⅰ Qt捕獲不到這個異常(linux操作系統) try { char *str=NULL; strcpy(str,"error"); //制

試試*str='e'

Ⅱ Linux下怎樣檢測進程是否異常

ps命令
輸入下面的ps命令,顯示所有運行中的進程:
# ps aux | less

其中,
-A:顯示所有進程
a:顯示終端中包括其它用戶的所有進程
x:顯示無控制終端的進程
任務:查看系統中的每個進程。
# ps -A
# ps -e

任務:查看非root運行的進程
# ps -U root -u root -N

任務:查看用戶vivek運行的進程
# ps -u vivek

任務:top命令
top命令提供了運行中系統的動態實時視圖。在命令提示行中輸入top:

Ⅲ Linux下能捕獲c++空指針異常嗎

#include <exception>
#include <iostream>
using namespace std;

/**********************************
//project -> Properties -> C/C++ -> Code Generation --> Enable C++ Exceptions
//選擇 Yes with SEH Exceptions (/EHa) 這樣的話C++的try catch 也可以捕獲到空指針,內存越界,0除異常
//默認是選擇Yes (/EHsc)
**********************************/

void TestIntType()
{
try
{
throw 1;
}
catch(...)
{
cout<< "在 try block 中, 准備拋出一個異常." << endl;
}
}

void TestDoubleType()
{
try
{
throw 0.5;
}
catch(...)
{
cout<< "在 try block 中, 准備拋出一個異常." << endl;
}
}

void TestEmptyPointType()
{
try
{
int* p = NULL;
*p = 3;
}
catch(...)
{
cout<< "非法地址操作異常" << endl;
}
}

void TestDivZeroType()
{
try
{
int b = 0;
int a = 3/b;
}
catch(...)
{
cout<< "0除異常" << endl;
}
}

void TestMemoryOutType()
{
int * a = new int[4];
try
{
for (int i = 0; i<245; i++)
{
a++;
}
*a = 3;
}
catch(...)
{
cout<< "內存越界異常" << endl;
}
}

int main(int argc, char* argv[])
{
TestEmptyPointType();
//TestDivZeroType();
TestMemoryOutType();
return 1;
}

Ⅳ Linux平台上,應用程序怎麼捕獲異常

什麼是Core Dump? Core的意思是內存, Dump的意思是扔出來, 堆出來. 開發和使用Unix程序時, 有時程序莫名其妙的down了, 卻沒有任何的提示(有時候會...

Ⅳ Linux 中異常是如何處理的

在程序的執行過程中,因為遇到某種障礙而使 CPU 無法最終訪問到相應的物理內存單元,即無法完成從虛擬地址到物理地址映射的時候,CPU 會產生一次缺頁異常,從而進行相應的缺頁異常處理。基於 CPU 的這一特性,Linux 採用了請求調頁(Demand Paging)和寫時復制(Copy On Write)的技術
1. 請求調頁是一種動態內存分配技術,它把頁框的分配推遲到不能再推遲為止。這種技術的動機是:進程開始運行的時候並不訪問地址空間中的全部內容。事實上,有一部分地址也許永遠也不會被進程所使用。程序的局部性原理也保證了在程序執行的每個階段,真正使用的進程頁只有一小部分,對於臨時用不到的頁,其所在的頁框可以由其它進程使用。因此,請求分頁技術增加了系統中的空閑頁框的平均數,使內存得到了很好的利用。從另外一個角度來看,在不改變內存大小的情況下,請求分頁能夠提高系統的吞吐量。當進程要訪問的頁不在內存中的時候,就通過缺頁異常處理將所需頁調入內存中。
2. 寫時復制主要應用於系統調用fork,父子進程以只讀方式共享頁框,當其中之一要修改頁框時,內核才通過缺頁異常處理程序分配一個新的頁框,並將頁框標記為可寫。這種處理方式能夠較大的提高系統的性能,這和Linux創建進程的操作過程有一定的關系。在一般情況下,子進程被創建以後會馬上通過系統調用execve將一個可執行程序的映象裝載進內存中,此時會重新分配子進程的頁框。那麼,如果fork的時候就對頁框進行復制的話,顯然是很不合適的。
在上述的兩種情況下出現缺頁異常,進程運行於用戶態,異常處理程序可以讓進程從出現異常的指令處恢復執行,使用戶感覺不到異常的發生。當然,也會有異常無法正常恢復的情況,這時,異常處理程序會進行一些善後的工作,並結束該進程。也就是說,運行在用戶態的進程如果出現缺頁異常,不會對操作系統核心的穩定性造成影響。 那麼對於運行在核心態的進程如果發生了無法正常恢復的缺頁異常,應該如何處理呢?是否會導致系統的崩潰呢?是否能夠解決好內核態缺頁異常對於操作系統核心的穩定性來說會產生很大的影響,如果一個誤操作就會造成系統的Oops,這對於用戶來說顯然是不能容忍的。本文正是針對這個問題,介紹了一種Linux內核中所採取的解決方法。
在讀者繼續往下閱讀之前,有一點需要先說明一下,本文示例中所選的代碼取自於Linux-2.4.0,編譯環境是gcc-2.96,objmp的版本是2.11.93.0.2,具體的版本信息可以通過以下的命令進行查詢:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
$ objmp -v
GNU objmp 2.11.93.0.2 20020207
Copyright 2002 Free Software Foundation, Inc.

Ⅵ 如何捕獲 System.loadLibrary 產生的異常

1. 我認為這個問題是與調用System.loadLibrary(字元串)LD_LIBRARY_PATH。使用LoadLibrary(「富」)將看著你的java.library.path的libfoo.so。如果發現任何libfoo.so你會得到這個錯誤。 現在,如果你只設置了LD_LIBRARY_PATH,你想要的原始符號將自動被拾起的連接器,所以你不需要設置-Djava.library.path。 在我的經驗與swig在GDAL項目,這個錯誤其實是無害的,因為LD_LIBRARY_PATH設置,這將正常工作。 我會使用-Djava.library.path和調用調用LoadLibrary explitly CodeGo.net,原因是,如果你決定要使用的webstart部署你的應用程序,你將需要顯式地調用LoadLibrary來讓你的本地庫拾起。 當月食我遵循達夫給您編輯在構建路徑Libraries選項卡下的jar本地庫的說明。只需再次,這只是設置在幕後java.library.path。 2. 你可以試試-Djava.library.path=actual.so行吧? 在Windows上,我也有類似的問題,第三方庫,JNI封裝的DLL,它的DLL。我的項目已經在lib目錄下的DLL,這樣我添加到庫的路徑(如:PATH=%PATH%;./lib變,一切都開始工作。 3. 據我知道的Eclipse沒有關系'的LD_LIBRARY_PATH。 要樹立正確的本地庫路徑的最簡單的方法就是去 項目屬性-> Java構建路徑->庫 然後展開或者JRE的系統庫條目或(如果有的話)的 jar文件的本地庫, 選擇「本地庫位置」,然後單擊「編輯...」並選擇你的庫。實際上它並設置-Djava.library.path變數,以便你必須包括這行,如果你開始從外面蝕你的程序的文件夾。 4. 這可能是因為你只需要找到運行配置對話框中合適的地方放-Djava.library.path=...選項。隨口說說我想你想-D在選項卡上的「VM定義,而如果要定義LD_LIBRARY_PATH就是那張在標簽上。Eclipse的讓你把東西在那裡他們贏得'你覺得什麼反正我庫這樣的地方以前,如果我有機會,我會仰望我做了什麼,在這里編輯我的答案。 另一件事,試圖與LD_DEBUG玩。您可以設置變數LD_DEBUG的事情(嘗試所有),然後Linux載入程序會泄露的各種關於什麼一個應用程序試圖載入,它在尋找的東西,等等。當然,這種預先假定您啟動Eclipse從行,所以你可以同時設置ENV增值經銷商,看到了loader的診斷,但就系統而言,當你從Eclipse中運行你的應用,你的應用程序僅僅是Eclipse是干什麼的,所以任何的庫裝載行為cocoa見以這種方式。 5. 是否有你的兩個庫依賴於任何其他庫?如果是這樣,你需要確保他們也可以訪問到JVM。 請注意,手動設置「-Djava.library.path」似乎清除預設的庫路徑。 所以,用下面的代碼:public class LibTest { public static void main(String[] args) { String property = System.getProperty("java.library.path"); StringTokenizer parser = new StringTokenizer(property, ":"); while (parser.hasMoreTokens()) { System.err.println(parser.nextToken()); } } } 從eclipse與Java 1.6.0_14輸出啟動:/opt/java/jre/lib/i386/client /opt/java/jre/lib/i386 /opt/java/jre/../lib/i386 /opt/java/jre/lib/i386/client /opt/java/jre/lib/i386 /usr/lib/xulrunner-devel-1.9.0.11 /usr/lib/xulrunner-devel-1.9.0.11 /usr/java/packages/lib/i386 /lib /usr/lib 但是,當我設置的JVM ARG「-Djava.library.path=/ tmp目錄/」我只得到:/tmp/ 如果您要手動設置java.library.path這也許可以解釋為什麼LDD的作品從行,但你的,所以不會從eclipse/ java的。 你可以試試不設置,而不是調用System.loadLibrary java.library.path System.load的絕對路徑到庫中。這可能使JVM能夠找到你,所以,默認的路徑尋找它的依賴時。 當然,如果這是,那麼你也可以嘗試打開JNI調試輸出與「-verbose:當使用JNI」上線。這可能給您的線索來解決問題。 6. 是LD_LIBRARY_PATH環境工作 7. 加入這個答案可能是它可以在AIX機器,我們需要設置LIBPATH變數,而不是LD_LIBRARY_PATH。

Ⅶ linux系統異常,學習如何通過系統日誌進行初

查看如下 兩個日誌對我們了解系統當時做了什麼操作有幫助。
/var/log/messages
記錄系統整體信息,一般來講各類報錯信息都會在這個日誌中記錄。
/var/log/cron
記錄系統定製任務的日誌。

首先我要定位系統異常的時間點,很簡單,我打開我的程序的目錄,找到運行日誌打開一看

可以直接看出來到7:20就沒有了,這說明程序運行到這個時間點之後就沒有在運行,基本上就是這個時間點異常了。
那麼系統日誌我們就按著這個時間點去看。
首先打開cron日誌找到對應的時間點,看了下似乎沒什麼異常之處。

接下來看messages日誌,找到對應的時間點之後發現了異常。
從7:20開始系統發生異常,然後桌面終端的情況被記錄到/var/spool/abrt/ccp-2017-11-09-07:20:02-5142.new/coremp
然後被程序調用的網卡被卸載掉,緊接著系統寫了一個mail。

上面的日誌中有一個error,根據這個報錯網路了下(這里我要吐槽網路,懷念google),大概意思是error 4的意思是用戶態程序內存訪問越界。
error number是由三個字位組成的,從高到底分別為bit2 bit1和bit0,所以它的取值范圍是0~7。
bit2: 值為1表示是用戶態程序內存訪問越界,值為0表示是內核態程序內存訪問越界
bit1: 值為1表示是寫操作導致內存訪問越界,值為0表示是讀操作導致內存訪問越界
bit0: 值為1表示沒有足夠的許可權訪問非法地址的內容,值為0表示訪問的非法地址根本沒有對應的頁面,也就是無效地址
error number是4, 轉成二進制就是100, 即bit2=1, bit1=0, bit0=0, 按照上面的解釋,我們可以得出這條信息是由於用戶態程序讀操作訪問越界造成的。
但是具體是什麼程序造成的我還沒弄清楚,但是用戶態程序也就是我運行的程序也就那麼幾個,逐個排查後應該可以得到結論。後續在慢慢弄。

Ⅷ Linux 中有名信號量,異常關閉其他線程如何獲取

linux下進程間同步的機制有以下三種:
信號量
記錄鎖(文件鎖)
共享內存中的mutex
效率上 共享內存mutex > 信號量 > 記錄鎖
posix 提供了新的信號量 - 有名信號量,既可以使用在進程間同步也可以作為線程間同步的手段。效率比共享內存mutex要好一些

Ⅸ Linux有沒有方法直接或者間接地用try-catch捕獲SIGSEGV

Linux下編程(尤其是服務端程序)若由於內存越界或其他原因產生「非法操作」,會導致程序悄無聲息地死去,初學者往往不知道程序死掉的原因。本人也曾飽受程序死不瞑目之苦。其實「非法操作」在絕大多數時候是因為「段錯誤」,即 SIGSEGV。而找到SIGSEGV信號拋出的位置,也就找到了程序死掉的原因。
下面列出一些捕獲SIGSEGV的方法。
假設程序名為 myprg,其進程ID(pid)為 2032。方法一:
# ./myprg // 運行程序
# ps -ef | grep myprg // 找出 myprg 的 pid
# gdb myprg 2032 > debug.log // 讓 gdb 接管 myprg 的運行
# (gdb) continue
此方法利用gdb調試器捕獲SIGSEGV。上例中,將gdb輸出信息存入debug.log,關閉終端,gdb並不退出,繼續運行直到 myprg 出錯退出。gdb將捕獲到出錯點。方法二:
# ./myprg // 運行程序
# Segment fault (core mped) // 程序死掉了,系統輸出 "Segment fault"
# gdb myprg core // 用 gdb 分析 core 文件
此方法利用core文件,進行事後分析。但前提是保證系統會生成core文件。
# ulimit -a
查看當前core文件大小的限制,若為0,則需將它改為unlimited。
# ulimit -S -c unlimited
或修改 /etc/profile,找到 unlimit -S -c 0,將0改為unlimited,重啟系統。
另外,如果程序安裝了 SIGSEGV 異常處理函數,那麼 gdb myprg core 時顯示的並不是真實的出錯位置,要想看到真實的出錯點,必須暫時去掉異常處理函數。

Ⅹ flowable 6.5.0在linux環境實例化異常問題

1、oracle資料庫當flowable用戶存在工作流相關表的時候,ftest用戶初始化失敗(自動建表失敗)。
2、刪除flowable用戶,ftest初始化成功。
3、再次新建flowable用戶,使用flowable用戶連接,初始化失敗。同時發現,yml文件中,存在flowable。database,schema屬性,(解釋為:In,some,situations,you,want,to,set,the,schema,to,use,for,table,checks,/,generation,if,the,database,metadata,doesn't,return,that,correctly。)。將其設置為flowable後,啟動時拋出異常(),異常拋出點為setSchema。查看Druid源碼,當調用setSchema會無條件拋出異常。
4、因此可以確定的是,目前遇到的工作流無法初始化,是因為同一個原因引起:資料庫中,存在其他已經初始化過的用戶/域。

熱點內容
湛江移動伺服器ip 發布:2024-10-26 13:12:17 瀏覽:633
找回dns伺服器地址 發布:2024-10-26 12:48:23 瀏覽:239
王者皮膚系統腳本 發布:2024-10-26 12:46:44 瀏覽:507
電腦配置8g怎麼查看 發布:2024-10-26 12:40:58 瀏覽:810
布朗編程 發布:2024-10-26 12:35:27 瀏覽:305
php平滑重啟 發布:2024-10-26 12:25:33 瀏覽:945
竹壓縮板材 發布:2024-10-26 12:21:32 瀏覽:754
重大校園網伺服器地址 發布:2024-10-26 12:06:10 瀏覽:876
js引入php 發布:2024-10-26 12:05:48 瀏覽:469
編程擴大條件 發布:2024-10-26 11:58:06 瀏覽:341