2025年4月

1、直接dubug到想要到达的位置,直接点击旁边的数字即可。

image.png

2、debug后不想重新启动,想重新进入再执行一次debug,可以使用drop frame来删除当前栈,跳到之前的栈再一次进入这个栈。

  • 注意这个是以栈为单位,即一个个方法来来回滚的,因此只能跳到上一个方法。
image.png

3、条件断点,右击两次断点红点,输入断点执行的等式就可以在满足条件的时候才进入该断点。

image.png

4、固定表达式追踪,可以点击加号添加想要跟踪的固定表达是,这样我们就不需要每次都打开对象去check对象内想知道的值。

image.png

<img src="https://upload-images.jianshu.io/upload_images/14404316-4f0877bf0d3e190c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" />

5、断点开关,可以选择暂时不进入的断点,方便调试。

image.png

6、动态修改形参的值,通过evaluate expression来动态临时修改形参的值来进行变量修改,满足我们特定变量的调试。

  • 注意在形参上修改才有效。
image.png
image.png
image.png

7、多线程调试,选择suspend为Thread就可以让当前线程断点到改位置。

image.png

image.png

8、源码debug调试,右击两次源码的断点进行源码位置代码的输出,辅助调试。

  • 注意双亲委派的模式下,优先加载JDK包下的源码,再加载本工程代码,再加载第三方如框架包。
  • 因此使用在本工程下创建第三方jar包路径下的代码类可以覆盖第三方类的加载。
  • 但是对于JDK源码则做不到,因为JDK源码是第一顺位加载的,只能在debug的时候加上这种调试输出。
image.png

参考

极海大佬的dubug分享

原文链接:https://www.jianshu.com/p/60cb31a459d8

在使用C++时,编译项目时偶尔会发生链接,这些错误很多时候是偶发的,可能再编一次,或者换个模式,换个参数,就没有编译错误了,但之后可能还会出现。由于是在编译阶段,问题不容易排查。这样的错误有可能就是静态变量的初始化问题。

  • 简单概括:当静态变量的初始化过程中,需要其他静态变量的值时,就有可能产生不确定的链接错误。
  • 主要原因:C++不固定静态变量的初始化顺序,在初始化静态变量时,如果你需要其他静态变量的值,但这个值又没有初始化,问题就发生了。
  • 解决方案:
    1. 尽量不要在静态初始化时引入其他静态变量,尤其避免循环依赖。
    2. 将静态变量,放到函数里面去,即:

    A& variable_name(){
      static A variable = ...;
      return variable;
    }
    

    每次想访问这个静态变量时,改为用variable_name()来进行访问,这个函数也没必要是成员函数,跟这个类一起放到头文件里就可以了(内联inline)。在函数内的局部静态变量第一次访问是初始化,之后自动再调用函数自动略过初始化语句。
    1. 为C++入口的_init()函数提供自定义实现,这个函数负责初始化静态变量,在这个函数内部人工确定顺序。(一般非必要不使用)

好的,接下来我们深入剖析下这个问题:

  • C语言没有这样的链接错误:C语言可以很简单的处理初始化变量,无论是基本类型还是结构体,在编译阶段就可以将初始化值放入.data节,自然就不存在这样的问题。C++的对象是由构造函数来构建的,编译时不执行代码,因此无法确定具体值,只能放在运行时完成。
  • 静态变量的初始化如果不牵涉其他任何自定义类型则不会出现问题:因为不会出现顺序问题,所以可以按正常语法初始化。
  • 那些需要其他静态变量的值做初始化的静态变量,最好按照方案2重写避免链接问题。

顺便说一句,对于非静态变量,比如类中的成员变量,在构造函数中,尽量以初始化列表的方式初始化,即

A(int _a, double _b, B & _c)
: a(_a),b(_b),c(_c),d()
{}

如果在函数体内执行,实际上是用默认构造函数初始化了一次,又赋值了一次。
而且,如果是常量对象和引用对象,则必须如此初始化!!

  • 还有一个值得注意的点:类内成员的初始化顺序,是按照他们在头文件中的排列顺序决定的,和构造函数的初始化列表无关。

参考资料:

  • 《Effective C++》第三版,条款04
  • 《高级C/C++编译技术》:第6章

原文链接:https://www.jianshu.com/p/650229abad34

1191 K-Concatenation Maximum Sum K 次串联后最大子数组之和

Description:
Given an integer array arr and an integer k, modify the array by repeating it k times.

For example, if arr = [1, 2] and k = 3 then the modified array will be [1, 2, 1, 2, 1, 2].

Return the maximum sub-array sum in the modified array. Note that the length of the sub-array can be 0 and its sum in that case is 0.

As the answer can be very large, return the answer modulo 109 + 7.

Example:

Example 1:

Input: arr = [1,2], k = 3
Output: 9

Example 2:

Input: arr = [1,-2,1], k = 5
Output: 2

Example 3:

Input: arr = [-1,-2], k = 7
Output: 0

Constraints:

1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4

题目描述:
给定一个整数数组 arr 和一个整数 k ,通过重复 k 次来修改数组。

例如,如果 arr = [1, 2] , k = 3 ,那么修改后的数组将是 [1, 2, 1, 2, 1, 2] 。

返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0。

由于 结果可能会很大,需要返回的 109 + 7 的 模 。

示例 :

示例 1:

输入:arr = [1,2], k = 3
输出:9

示例 2:

输入:arr = [1,-2,1], k = 5
输出:2

示例 3:

输入:arr = [-1,-2], k = 7
输出:0

提示:

1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4

思路:

模拟
当 k = 1 时, 转化为最大连续子数组和, 注意答案非负
当 k = 2 时, 为数组最大前缀和和最大后缀和的和
当 k > 2 时, 如果数组的和为正, 需要加上 sum * (k - 2)
时间复杂度为 O(n), 空间复杂度为 O(n)

代码:
C++:

class Solution 
{
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) 
    {
        int n = arr.size(), pre = 0, result = 0, mod = 1e9 + 7, sum = 0;
        for (int i = 0; i < (n << 1); i++) 
        {
            pre = max(arr[i % n], pre + arr[i % n]);
            result = max(result, pre);
            if (k == 1 and i == n - 1) return result;
            if (i < n) sum += arr[i];
        }
        return (int)((max(0, sum) * (long)(k - 2) + result) % mod);
    }
};

Java:

class Solution {
    public int kConcatenationMaxSum(int[] arr, int k) {
        int n = arr.length, pre = 0, result = 0, mod = 1_000_000_007, sum = 0;
        for (int i = 0; i < (n << 1); i++) {
            pre = Math.max(arr[i % n], pre + arr[i % n]);
            result = Math.max(result, pre);
            if (k == 1 && i == n - 1) return result;
            if (i < n) sum += arr[i];
        }
        return (int)((Math.max(0, sum) * (long)(k - 2) + result) % mod);
    }
}

Python:

class Solution:
    def kConcatenationMaxSum(self, arr: List[int], k: int) -> int:
        result, pre, s, mod = 0, 0, sum(arr), 10 ** 9 + 7
        arr *= min(k, 2)
        for i, v in enumerate(arr):
            result = max(result, (pre := max(v, v + pre)))
        return (max(result, s * (k - 2) + result) if (s > 0 and k > 2) else result) % mod

原文链接:https://www.jianshu.com/p/dc666ae89f2e

续70同学的《Its about time》,尝试阐述一下typecho的简洁哲学,希望能从下面三点让大家了解我们作为一个小团队,是如何设计程序架构、用户界面及取舍各种需求的,不足之处请多多指教。

安静的容器

快节奏的生活里总是有很多酸甜苦辣,五味杂陈,我们用文字、图片、音频在博客上记录下这些精彩或不精彩的片段,分享给所有能看到的人并希望能获得反馈。typecho想提供这样一个产品,它如同安静的玻璃瓶,简简单单,没有什么花巧的装饰。撰写者只需要考虑往容器里放什么,而不是怎么放;容器能忠实呈现给读者的,是撰写者独一无二的生活,而不是容器自己。

所以, typecho的前后端界面设计,都是趋向简约的,不吵闹的,我们追求“刚刚好”,我们想让typecho就是一张白纸,也许有些质感,但重要的是你用什么色彩在书写,这白色不会成为干扰,而会让这些色彩更凸显。

有限的需求满足

typecho不是我们的全部,时间精力的限制,不允许所有的需求都被满足。我们持有这样的观点:只针对有限的需求去开发有限的功能,并让这些功能表现卓越。所以typecho可能缺少一些你偶尔会用到的功能,但是你经常使用的部分,它一定就在那里,而且会给你惊喜。我们在开发的讨论中也提出开发各种新奇的特性,实验各种领先的技术,但大部分都不会运用到typecho。欲望需要收敛,因为现有功能都不够完美。

收敛的需求也带来负面的影响,typecho不是一款能兼容所有环境的程序,它常常在rewrite或其他方面有一些瑕疵,这方面wordpress做得更棒。

需求的有限满足

经常有用户说需要编辑器、需要友情链接管理、需要置顶日志或其他什么功能,这些都可以通过插件来变通实现。实际上很多易用性问题,我们都寄希望于第三方开发来完善,这也是官方文档建设再次被提上日程并承诺重视的原因,开放会带来期待中的多样性,造就一个有趣的小生态系统。typecho只能有限满足一部分用户对博客程序的要求,可预见的未来里,它也不会是一个CMS。

选择权在用户手中,如果你需要一个简洁的博客程序,typecho就在这里。

标签:none

是的,你没有看错,经过漫长的等待,我们终于发布了 Typecho 1.2.0 正式版。这个版本的开发经历了如此长的时间,以至于我无法一次性列出这么长的详细改进列表。

除了修复了很多bug以外,我们重要的改进有如下几点:

  1. 新的编辑器实时预览自动跟随效果,以及主题内预览功能
  2. 后台界面对移动端的适配
  3. 新的安装程序
  4. 进入 PHP 7.2 时代,以及对 PHP 8 的更好支持
  5. 对容器化的更好支持

除了新功能,大家也可以发现我们的版本号规则有变化。新的版本号会采用常规的3组数字组成,比如1.2.0。它适合小步快跑的开发模式,具体的解释可以看这篇文章。

这个小小的软件记录了我们很多人生命中最美好的时光,大家用它在缤纷多彩的互联网上留下自己的印记。快乐,伤痛,成长,迷惘,时间无情地流过,我们却让它有了意义。这时我们再回头来看 Typecho 的名称组成:轻击键盘,静候回音。在你写下文字的时候,涟漪已然产生。

而于我来说,十多年前键盘敲下的第一行代码,也不知不觉产生了这么大的回响。在这春回大地之际,感怀之余,未免又对未来心生希望起来。让我们大声宣布,Typecho 回来了!