当前位置:首页 » 操作系统 » 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、因此可以确定的是,目前遇到的工作流无法初始化,是因为同一个原因引起:数据库中,存在其他已经初始化过的用户/域。

热点内容
近两年藏文编译汉藏翻译工作 发布:2024-10-26 10:46:52 浏览:253
路由器的通用管理员密码多少 发布:2024-10-26 10:45:10 浏览:105
无线算法是什么 发布:2024-10-26 10:44:33 浏览:559
起亚秀尔配置如何看 发布:2024-10-26 10:31:18 浏览:778
光纤猫的超级密码是干什么用的 发布:2024-10-26 10:30:26 浏览:706
电脑华为云空间服务器异常 发布:2024-10-26 10:30:25 浏览:872
缔造者刷青龙脚本 发布:2024-10-26 10:05:50 浏览:474
电视账号密码在哪里设置 发布:2024-10-26 10:03:51 浏览:80
cisco密码加密 发布:2024-10-26 09:53:50 浏览:184
附件上传框 发布:2024-10-26 09:52:19 浏览:821