Rise的自留地

记录生活中的点滴,分享编程技术和游戏开发经验。

0%

对于点击 <a target='_blank'> 标签打开新 tab 页的场景,Puppeteer目前(2019-03,v1.13.0)没有现成的 API 支持。因此需要一些 walkaround 来解决。有几个方案。

提取 href,手动打开新 page 去访问

1
2
3
4
url = await page.evaluate('() => $("a").attr("href")')
detail_page = await browser.newPage()
# goto 带了 waitForNavigation 的作用
await detail_page.goto(detail_page_url)

使用点击,再去轮徇 pages

代码如下。这个方案的问题在于,拿到 detail_page 时并不知道页面是否 load 完成了,在这个时候调用 .waitForNavigation() 可能会超时报错(因为没有 load 事件被 fire)。如果页面有 AJAX 请求,你可能需要写额外的 waitForSelector 来确保你要的数据已经在页面上。

使用VSCode进行查找、替换时,经常需要用到正则表达式,一段时间不用就忘了,每次要用的时候都要耽误很多时间去查找,所以整理了一份很全的放在这里。这个其实是.NET使用的正则表达式,VSCode也是一样的,微软系的产品(比如Visual Studio等)应该都是使用这个标准的。

凡有名者,皆为左值

1. 什么是左值、右值

首先不考虑引用以减少干扰,可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边

英文:Fsf,翻译:Linux中国/robot527 原始地址

• break — 在指定的行或函数处设置断点,缩写为 b
• info breakpoints — 打印未删除的所有断点,观察点和捕获点的列表,缩写为 i b
• disable — 禁用断点,缩写为 dis
• enable — 启用断点
• clear — 清除指定行或函数处的断点
• delete — 删除断点,缩写为 d
• tbreak — 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
• watch — 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行
• step — 单步跟踪,如果有函数调用,会进入该函数,缩写为 s
• reverse-step — 反向单步跟踪,如果有函数调用,会进入该函数
• next — 单步跟踪,如果有函数调用,不会进入该函数,缩写为 n
• reverse-next — 反向单步跟踪,如果有函数调用,不会进入该函数
• return — 使选定的栈帧返回到其调用者
• finish — 执行直到选择的栈帧返回,缩写为 fin
• until — 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用),缩写为 u
• continue — 恢复程序执行,缩写为 c
• print — 打印表达式 EXP 的值,缩写为 p
• x — 查看内存
• display — 每次程序停止时打印表达式 EXP 的值(自动显示)
• info display — 打印早先设置为自动显示的表达式列表
• disable display — 禁用自动显示
• enable display — 启用自动显示
• undisplay — 删除自动显示项
• help — 打印命令列表(带参数时查找命令的帮助),缩写为 h
• attach — 挂接到已在运行的进程来调试
• run — 启动被调试的程序,缩写为 r
• backtrace — 查看程序调用栈的信息,缩写为 bt
• ptype — 打印类型 TYPE 的定义

break

使用 break 命令(缩写 b)来设置断点。

说明

MiniDumper(LPCTSTR DumpFileNamePrefix)

MiniDumper(LPCTSTR DumpFileNamePrefix, LPCTSTR CmdLine, LPCTSTR ExeNameToReboot /* = NULL */)

DumpFileNamePrefix 崩溃文件名前缀

CmdLine 生成崩溃文件后执行命令(包含参数)

ExeNameToReboot 生成崩溃文件后执行指定程序

使用示例

在崩溃时调用指定的程序,下面的示例是调用CrashReport.exe上传到指定的服务器

其实很早就知道两个函数其中有一个在面临内存覆盖时行为有点特别, 但是工作中很少用到此场景, 也就没有深究. 现在居然面试遇到了, 那就把研究清楚吧.

  • memcpy 简单粗暴, 不考虑内存重叠问题. 后果程序员自负
  • memmove 比memcpy多了层检查内存重叠的考虑,如果发现重叠, 则反向拷贝, 性能和memcpy基本一样. 就是多了个检查是否重叠的代码.

综上所述, 以后干脆就用memmove吧. 省的那么多事. 反正性能几乎没有损失.

linux & mac

  1. 产生core文件方法
  • 在当前环境下生成coredump文件,运行 ulimit -c unlimited
  • 永久生成coredump文件,在 /etc/profile 文件中追加一行 ulimit-c unlimited
  1. 默认coredump文件生成在当前工作目录,修改文件 /proc/sys/kernel/core_pattern/data/coredump/core.%e.%p 其中%e表示程序名,%p表示进程id,路径为/data/coredump目录
  2. 编译时要加上-g选项,这个才能用gdb调试的coredump
  3. linux使用加载gdb加载coredump文件进行调试
1
2
3
4
5
gdb coredumpfile
#或者
gdb execfile
#加载完成后再输入
core-file coredumpfile
  1. mac使用lldb加载coredump文件进行调试
    1
    2
    
    cd /cores
    lldb -c coredumpfile
  • ulimit -c 显示核心转储文件大小的最大值,如果这里是零:禁止核心转储(对于本进程和它的子进程)。
  • 默认情况下,mac core文件均存在/cores目录下,linux core文件存在当前工作目录。
    • 可以通过ulimit -c unlimited来设置core文件生成路径。
    • 可以通过ulimit -c size来设置core文件大小。
    • 可以通过ulimit -c 0来禁止生成core文件。

windows

windows 请查看这篇文章 Windows C++ 程序崩溃收集工具

一、配置环境 • 安装XCode https://developer.apple.com/xcode/ xcode-select --install • 安装JDK https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html • 安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" • 安装工具 brew install git python make curl • 安装MacPort https://www.macports.org/install.php • 安装工具 POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg 二、创建磁盘镜像