Ubuntu下调试Qt报错ptrace operation not permitted


转载:

http://www.linuxidc.com/Linux/2013-01/77916.htm


QtCreator是一个非常好的IDE,可以用来开发Qt应用程序和一般的C++应用程序。但是在Ubuntu上调试应用程序,有时候会出现错误(如内存访问错误),QtCreator会弹出错误对话框,显示QtCreator: ptrace operation not permitted,如下图所示。

解决方法

这个错误特别出现在Ubuntu 11.04之后的版本中,为了解决这个问题,有两种方法,这两种方法都需要root权限。

第一种解决方法可以临时解决这个问题,但是在下次重新启动系统是会失效。方法是将/proc/sys/kernel/yama/ptrace_scope虚拟文件的内容设为0,使用命令:

sudo echo 0 > /proc/sys/kernel/yama/ptrace_scope

第二种解决方法可以永久解决这个问题,方法是编辑/etc/sysctl.d/10-ptrace.conf这个文件,设置

kernel.yama.ptrace_scope = 0(默认是1)

这样下次启动时也会生效。

原因

在Ubuntu 11.04("Natty Narwhal")之后的版本中,一种叫做ptrace scope的安全机制被引入。这种机制防止用户访问当前正在运行的进程的内存和状态,这就造成QtCreator的调试器不能正常工作。这种安全机制可以防止恶意软件附加到其他进程中(如SSH或者GPG),读取程序内存,产生安全问题。

------------------------------------------分割线------------------------------------------

再一例:

直接点击图标运行了qt creator,在调试的时候报错,如图

很明显,是权限不足的问题。解决方法就是改用 sudo ./qtcreator

的方式启动,为了方便,可以再home下创建一个qtcreator的

快捷方式,这样就不用每次都cd到程序所在目录了。



建议使用临时的解决办法也就是上面的第一种方法,原因是避免引起系统安全问题。







转载一个su账户切换问题:

http://www.jb51.net/LINUXjishu/63312.html



linux使用su切换用户提示 Authentication failure的解决方法



这个问题产生的原因是由于ubtun系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在终端中输入如下命令:

sudo passwd

Password:你当前的密码

Enter new UNIX password:这个是root的密码
Retype new UNIX password:重复root的密码
然后会提示成功的信息。

在说明一点,使用su和sudo是有区别的,使用su切换用户需要输入所切换到的用户的密码,而使用sudo则是当前用户的密码。





thread_setschedparam: Operation not permitted

06-26

/*rn *attr.c rn */rnrn#include rn#include rn#include rn#include rn#include rnrn#define handle_error_en(en, msg) \rn do errno = en; perror(msg); exit(EXIT_FAILURE); while (0)rn rnstatic void display_sched_attr(int policy, struct sched_param *param)rn rn switch(policy) rn rn case SCHED_FIFO:rn printf("policy=%s,priority=%d\n","SCHED_FIFO",param->sched_priority);rn break;rn case SCHED_RR:rn printf("policy=%s,priority=%d\n","SCHED_RR",param->sched_priority);rn break;rn case SCHED_OTHER:rn printf("policy=%s,priority=%d\n","SCHED_OTHER",param->sched_priority);rn break; rn default:rn printf("Error:unknown optional.\n");rn break;rn rnrnstatic void display_inheritsched(int inheritsched)rnrn switch(inheritsched)rn rn case PTHREAD_INHERIT_SCHED:rn printf("inheritsched is %s\n","INHERIT");rn break;rn case PTHREAD_EXPLICIT_SCHED:rn printf("inheritsched is %s\n","EXPLICIT");rn break;rn default:rn printf("Error:unknown optional.\n");rn break;rn rn rnstatic void display_thread_sched_attr(char *msg)rnrn int policy, ret;rn struct sched_param param;rnrn ret = pthread_getschedparam(pthread_self(), &policy, &param);rn if (ret != 0)rn handle_error_en(ret, "pthread_getschedparam");rnrn printf("%s\n", msg);rn display_sched_attr(policy, &param);rnrnrnstatic void * thread_start(void *arg)rnrn //显示线程的调度属性rn display_thread_sched_attr("\nScheduler attributes of new thread:");rn return NULL;rnrn rnint main(int argc, char *argv[])rnrn int ret,inheritsched,policy;rn pthread_t tid;rn pthread_attr_t attr;rn struct sched_param param;rnrn param.sched_priority = 10; rn policy = SCHED_FIFO;rn ret = pthread_setschedparam(pthread_self(), policy, &param);rn if (ret != 0)rn handle_error_en(ret,"pthread_setschedparam"); rn display_thread_sched_attr("Scheduler settings of main thread:");rn printf("\n");rnrn //初始化线程属性rn ret = pthread_attr_init(&attr);rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_init"); rn rn //设置继承调度属性 rn inheritsched = PTHREAD_EXPLICIT_SCHED;rn //inheritsched = PTHREAD_INHERIT_SCHED; rn ret = pthread_attr_setinheritsched(&attr, inheritsched);rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_setinheritsched"); rn rn //设置线程优先级 rn param.sched_priority = 12;rn ret = pthread_attr_setschedpolicy(&attr, policy);rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_setschedpolicy"); rn ret = pthread_attr_setschedparam(&attr, &param);rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_setschedparam");rnrn //获得线程调度属性 rn ret = pthread_attr_getschedparam(&attr, &param);rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_getschedparam"); rn printf("scheduling parameter attributes:\n");rn display_sched_attr(policy, &param); rn rn //获得线程继承调度属性rn ret = pthread_attr_getinheritsched(&attr, &inheritsched); rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_getinheritsched");rn printf("\nInherit scheduler attribute:\n");rn display_inheritsched(inheritsched); rnrn //创建线程rn ret = pthread_create(&tid, &attr, &thread_start, NULL);rn if (ret != 0)rn handle_error_en(ret, "pthread_create");rnrn /* Destroy unneeded thread attributes object */rn ret = pthread_attr_destroy(&attr);rn if (ret != 0)rn handle_error_en(ret, "pthread_attr_destroy");rnrn ret = pthread_join(tid, NULL);rn if (ret != 0)rn handle_error_en(ret, "pthread_join");rnrn exit(EXIT_SUCCESS);rnrn上面的程序,gcc -lpthread -o attr attr.c编译后执行报错:thread_setschedparam: Operation not permitted,哪位高手帮忙解决一下,谢谢您 !

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试