- 博客(13)
- 收藏
- 关注
原创 现代C++软件架构--功能性和非功能性需求
作为一名架构师,认识到哪些需求对架构重要以及重要的原因是非常重要的。包括功能性需求和非功能性需求。功能性需求是指那些告诉你解决方案应该做什么的需求,而非功能性需求告诉你解决方案应该是怎样的。
2025-01-19 21:30:46
263
原创 现代C++软件架构--架构风格
的行为依赖于其内部状态。我们以Web服务为例,如果服务记住了自己的状态,该服务的使用者可以在每个请求中发送更少的数据,因为该服务记住了这些请求的上下文。然而,虽然节省了发送请求大小和带宽数据的开销,但在Web服务方面有一项隐藏的成本。如果用户同时发送很多请求,则服务必须同步这些请求。由于可能会有多个请求同时改变服务状态,没有同步机制可能会导致数据争用。如果服务是的,那么每个指向它的请求都需要包含成功处理它所需的所有数据。这意味着请求数据将变得更多,消耗更多的带宽,但服务将拥有更好的性能和可伸缩性。
2025-01-19 20:59:17
619
原创 现代C++软件架构--软件架构思想
为了使产品满足业务需求和性能、可维护性、可伸缩性等属性,你需要设计它的架构,并且最好尽早完成。无论你是否有意识地努力去构建它,最终你都会得到某种架构。如果经过几个月甚至几年的开发,仍然希望软件保持较高的质量,那么需要尽早采取一些措施。如果不考虑架构,那么软件很可能永远不会达到要求的质量。
2025-01-19 10:40:43
903
原创 C/C++调试---调试工具
在软件开发过程中,我们不可避免地会遇到各种性能问题、系统故障或其他预料之外的挑战。要有效地诊断和解决这些问题,选用合适的工具是关键。下面介绍3个出色的Linux性能分析和调试工具的世界:strace、Perf以及eBPF。
2025-01-12 17:49:17
859
原创 C/C++调试---内存调试工具
作为内嵌内存调试的典型例子,glibc内存管理器ptmalloc实现了一个基于填充的简单且非常有用的调试特性。我们可以通过将环境变量MALLOC_CHECK_设置为非零数值来启用它。该值的最低两位决定了ptmalloc在检测到错误时应采取的操作:如果最低位设置了(例如1),那么每次检测到错误时都会在stderr上打印出错误消息,如果不考虑最低位,第二低位设置了(例如2),那么只要核心转储打开,ptmalloc就会在检测到错误时终止进程并生成一个核心转储文件。
2025-01-12 17:15:22
315
原创 C/C++调试---调试多线程程序
多线程程序对调试确实提出了一些独特的挑战。线程安全和线程争用等问题通常表现为间歇性且不可预测。多线程程序的行为会受到众多因素的影响,如系统配置(例如CPU的数量)、IO速度(例如网络和文件服务器的性能)以及系统负载等。这些环境条件通常是短暂的,因此复现问题可能会相当困难。线程问题有多种表现形式,。
2025-01-12 14:45:13
370
原创 C/C++调试---汇编2
最后一条指令负责读取虚函数表中偏移32字节(0x20)的条目并跳转至其中的地址,该地址是派生类的虚函数的实现。然而,读取分配在寄存器中的局部变量和参数的正确值会比较有挑战,因为它们可能会在某些地方被临时保存、占用,然后恢复,这在优化的代码中相当常见。该指令的操作数为被调用函数的地址。它从位于-64(%rbp)的数组中读取元素,每个元素的大小为8字节,元素索引在%rax中。这对应类似的代码arr[i],其中arr的起始地址为-64(%rbp),i存储于%rax中,数组元素大小为8字节,比如long。
2025-01-09 22:23:09
925
原创 C/C++调试---汇编
前面提到leave指令等同于两条指令——mov rbp、rsp和pop rbp,它与序言正好相反,它首先恢复栈指针,然后将前一个帧寄存器rbp的值弹出栈。注意,pop指令会将栈寄存器rsp隐式地调整8字节(32位模式下为4字节),这会将rbp和rsp完全恢复为先前栈帧的值。ret指令弹出下一条要执行的指令的地址,并将它设置到程序计数器寄存器rip。这为线程在完成此函数调用后继续运行做好准备。用户代码生成的指令很大一部分是对数据的读取或修改。
2025-01-08 22:10:57
2283
原创 C/C++调试---C++对象布局
结构体的对齐要求是所有单个字段中的最大要求。数组的对齐要求与数组中每个元素的要求相同。如果复合类型具有多个层级,那么这些规则适用于所有层级。在所有的字段中,字段d的对齐要求最大,为8字节。因此,这个结构体aggr_type需要按8字节对齐。它同时也需要一些填充,从而确保每个字段满足对齐要求。字段c一共有3字节的填充,字段s有6字节的填充。这些填充使得紧接的字段i和字段d相应地对齐在需要的4字节和8字节上。当编译器为栈分配变量时,会确保每个变量,无论是原始类型还是复合类型,都满足其对齐要求。
2025-01-07 22:51:12
882
原创 C/C++调试---内存损坏
内存损坏通常指代码覆写一块不属于自己的内存,或者即使内存属于改写者,但错误的写操作导致内存数据超出有效范围。内存损坏可能是我们需要调试的最棘手的问题之一。主要原因在于这类问题的发生、传播和爆发具有随机性。通常在问题发生的时刻或地方不会有什么症状,被损坏的数据要么深深潜伏在其他数据结构中,要么沿着控制流传播到很远,直到很久以后程序在看似毫不相关的地方崩溃。就是由内存损坏导致的程序崩溃是内核确定程序在访问无效内存时采取的措施。
2025-01-06 22:47:06
337
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人