首页 文章 精选 留言 我的

精选列表

搜索[Spring调试器],共10012篇文章
优秀的个人博客,低调大师

为什么在Docker里使用gdb调试器会报错

背景 前几天一个小伙伴发邮件问我,他在docker内部使用gdb调试时刻遇到了gdb如下报错信息ptrace:Operation not permitted 当时我的答复是在docker create或者docker run时刻开启万精油--privileged参数。小伙伴的问题就此解决了。 但是事实并非如此简单 Docker上涉及到gdb调试权限的特性 capabilities Docker借用了linux对进程设置capabilities,而其子进程继承父进程capabilites特性来完成对容器capacities的控制。Docker create和docker run参数中有下面两个参数可以对容器默认的capabilites进行修改:--cap-add //添加某个capabilites属性 --cap-del //剔除某个默认的capabilites属性 cap-add和cap-del可以设置的参数可以通过下面链接查询到:https://docs.docker.com/engine/reference/commandline/run/ Docker 将gdb调试需要SYS_PTRACE属性被禁止掉了,所以gdb在调试的时候会显示ptrace被禁止。所以想在docker内部调试gdb解决办法就是create和run的时候带上--cap-add sys_ptrace* 例如: docker run -it --cap-add sys_ptrace centos:latest /bin/bash root@7f5a2130e975>cd /home/ root@7fa2130e975> vi test.c \#include <stdio.h> int main(){ int i = 0; printf(“Testing begin\n”); While(1){ printf(“Loop cnt:%d\n”,i++); sleep(10); } } root@7fa2130975>gcc -c -g -o test.o test.c root@7fa2130975>gcc -o test -g test.o root@7fa2130975>./test& [1] 18 root@7fa2130975>gdb attach 18 //ok可以调试了 但是这并不是问题的全部,对于上述测试程序,如果执行下面命令gdb又有告警出来 root@7fa2130975>gdb ./test (gdb) r Warning:Error disabling address space randomization:Operation not permitted 虽然依然可以调试,但是我们还是需要搞清楚上述告警的意思。地址随机化是linux一项安全特性,它允许内核进程启动每次加载库的时候都在随机化的分布在进程虚拟内存地址空间上(早期固定的库要加载到固定地方,如果固定地方被占用才加载到别地方。会造成多次加载程序,其库地址都不变。如此有安全隐患)。在gdb调试中gdb默认需要关闭linux的地址随机化功能,可以通过gdb 命令set disable-randomization off关闭。如果在地址随机化下调试同一段程序,多次run时候可以看到它的运行地址和函数地址不一致,这没有什么太大的问题。问题可以结束了 关于gdb 设置地址随机化开关详情见下面链接:http://visualgdb.com/gdbreference/commands/set_disable-randomization 当然上述告警其实也可以不通过gdb设置来完成,可以通过下面介绍的Docker参数可以达成。 seccomp Docker默认情况下为每个容器都设置了一个默认的seccom profile。一般情况下无需修改。但是docker依然支持 docker create或者docker run时候通过--security-opt seccomp=xxx参数来设置docker容器的seccomp策略。 xxx可以是一个json格式文件,里面定义了docker容器每个具体的seccomp规则。也可以是字符unconfined表示关闭默认的docker seccomp 规则。 可以通过下面命令彻底关闭docker默认seccomp引入的任何限制docker run -it --security-opt seccomp=unconfined centos:lastes 在运行上述gdb 调试命令run一个进程,告警信息终于彻底消失了。 Docker设置的seccomp 默认profile规则可以通过如下链接查询到:https://docs.docker.com/engine/security/seccomp/ 本文就不再做详细展开了。 Docker背后的实现技术 Docker实现seccomp控制 从Linux 2.6.23开始支持这种特性对进程能够使用的系统调用进行控制,如此可以进行一些安全性策略。sandbox就是依赖于此技术。docker梳理了Linux的系统调用,从300+个系统调用中屏蔽掉了44个系统调用,但是又最大程度的不影响正常的应用使用系统。 在Docker engine上有一个叫seccomp模块提供了为docker提供默认seccomp规则(GetDefaultProfile()函数),而我们在命令行配置的seccomp属性会覆盖默认的seccomp规则(在setSeccomp()函数里)。最终规则在engine内部创建runc spec时刻函数createSpec生产。将seccomp传递到oci runtime spec的spec.linux.seccomp字段里。 而runc通过seccomp库的InitSeccomp()函数,在Init一个容器时刻和exec触发的将一个进程setns到容器内部时刻调用此函数 将seccomp属性设置到容器的init进程或者exec进程里。 Linux进程属性里有seccomp属性,此属性也会父子继承,通过/proc/$pid/status里可以看到进程的seccomp属性。 Docker实现capabilities 从Linux 2.1开始支持的特性,将超级用户的权限划分为多个组,每个进程都有一个capabilities属性,子进程从自己的父进程中基础capacities。这个特性和sudo不一样,因为sudo控制粒度太粗;而capabilities控制粒度很精细。linux有一系列的调用可以设置、查看,清除和比较进程的capabilities。可以通过:man cap_set_flag 来查看这一系列的系统调用。而具体进程的capacities可以通过/proc/$pid/status中: Capxxx字段看到,本文就不再展开。感兴趣的朋友可以参考https://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html 在oci runtime spec里规定了spec.Process.Capabilities属性。runc中finializeNamespace()根据此属性对进程的capabilities进行设置。此函数会在init容器和exec加一个进程到容器时刻调用。

优秀的个人博客,低调大师

将Chrome调试器里的JavaScript变量保存成本地JSON文件

我写了一个系列的文章,主要用来搜集一些供程序员使用的小工具,小技巧,帮助大家提高工作效率。 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理器的替代者-Process Explorer 介绍一个强大的磁盘空间检测工具Space Sniffer 如何在电脑上比较两个相似文件的差异 程序员工作效率提升系列-推荐一个JSON文件查看和修改的小工具 我们在Chrome开发者工具的Console标签页里,可以输入JavaScript变量然后回车,查看这些变量的值。 比如我用类jQuery选择器的语法 var button = $('button')来返回当前页面所有button标签的实例。 如果我想将这个变量保存到本地,以备以后进一步分析,一种做法是用JSON.stringfy将其序列号成JSON字符串,然后再手动选中该字符串,新建一个本地文件,复制进去并保存。 这套办法可行但是太麻烦了。现在我向大家分享一种自动化的做法。 (function(console){ console.save = function(data, filename){ if(!data) { console.error('Console.save: No data') return; } if(!filename) filename = 'console.json' if(typeof data === "object"){ data = JSON.stringify(data, undefined, 4) } var blob = new Blob([data], {type: 'text/json'}), e = document.createEvent('MouseEvents'), a = document.createElement('a') a.download = filename a.href = window.URL.createObjectURL(blob) a.dataset.downloadurl = ['text/json', a.download, a.href].join(':') e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null) a.dispatchEvent(e) } })(console) 把这段代码粘贴到Chrome开发者工具的console标签页执行,给标准的console对象新增一个save方法。这个方法有两个输入参数,第一个为待保存成本地JSON文件的JavaScript变量,第二个参数为本地JSON文件的名称。 还是回到上面的例子,我在Chrome开发者工具的console页面执行了上述的JavaScript代码后,紧接着再执行下面的语句: console.save(button, "button.json"); 回车,Chrome自动弹出一个JSON文件保存窗口: 保存到本地即可。这种方式省去了手动将JavaScript变量序列化成JSON string再手动保存成本地文件的工作量,提升了程序员的工作效率。 要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册