安装依赖
sudo apt-get install g++ curl libssl-dev apache2-utils git-core build-essential
从官网下载源码
git clone https://github.com/nodejs/node.git
编译调试
选择Debug构建类型,生成node_g命令
cd node
$ ./configure --debug && make -j4
这里不推荐make -j6占用内存太大,程序容易终止(signal 9)
编译完成后:
可能遇到的问题
signal 9 是一个 SIGKILL 信号,表示进程被强制终止。这通常是由于操作系统在内存不足时自动杀死了进程。
解决办法:扩大linux交换分区
$ mkdir -p /opt/swap/
$ cd /opt/swap/
## 创建10G大小交换分区
$ sudo dd if=/dev/zero of=swap bs=1024 count=10000000
$ sudo mkswap -f swap
$ sudo swapon swapfile
注意:这是一种临时swap分区,关机后创建的分区会消失,所以如果还需要分区,建议挂起
从入口进入调试
Node.js的入口文件为src/node_main.cc,我们从node_main.cc进入
$ gdb --args ./node_g src/node_main.cc
在使用gdb调试程序时,
--args是一个命令行选项,用于指定程序运行时的命令行参数。它的语法如下:
gdb --args program arg1 arg2 ...
其中,program是要调试的程序的可执行文件路径,arg1、arg2等是程序运行时的命令行参数。使用--args选项可以将程序运行时的命令行参数一并传递给gdb,方便在调试时使用。例如:
gdb --args ./myprogram arg1 arg2
下图,gdb已经运行成功
gdb操作
设置断点
进入调试我们可以先设置断点 b为设置断点命令缩写,完整为break
# 在main函数处设置断点
(gdb) b main
如图我们打好了一个断点
启动程序
r启动程序命令缩写,完整为run
(gdb) r
启动运行后在断点处停下
显示源码
l显示源码,完整为list
(gdb) l
可以看到main会return一个node::Start函数。在 C++ 中,双冒号 "::" 是作用域解析运算符,用于指定命名空间或类的作用域。所以这是一个node.cc文件中的Start函数,是Node.js的核心入口。