跳到主要内容
版本:master

快速上手

driver的启动

查看全部启动参数

使用 --help(或者 -h, -H) 作为命令行参数启动driver可以获取启动参数说明:

gs.exe --help

常用的启动参数

下面将介绍一些常用的启动参数,更详细的启动参数见文末。

  • /r 设置根目录
  • /e 启动脚本
  • /eq 启动脚本,在脚本执行完成后退出
  • /m 可以带多个预加载的脚本,如果有多个用逗号隔开(,)
  • --mount 挂载目录
  • /D 预定义宏
  • --require || --require all 导入内置插件(用于兼容旧代码,详细说明见 import 章节中的相关说明)
  • /c1 开启命令行交互模式

其中/c1 常用于linux系统中,windows下是默认开启的。

下面给出一个例子更好的理解上述的其他参数,可以不用关注语法细节,使用的语法也非常简单,需要关注的是启动参数的使用方法。

目录结构如下:

sample-server
├─start_server.bat
├─server
| ├─preload.gsh
| └server.gs
├─etc
| └test.txt
├─bin
| └gs.exe

start-server.bat 内容如下

.\bin\gs.exe /r ./server/ /e /server.gs /m /preload.gsh --mount ./etc::/etc_m

可以看到这句批处理将根目录设置为./server/, 后面/e/m都是相对于这个根目录来说,mount是将当前目录下的etc文件夹挂载到根目录下的etc

preload.gsh 内容如下

write("load preload.gsh\n");

sever.gs 内容如下

write("sample server\n");

启动脚本后可以看到先输出了load preload.gsh 然后输出了sample server, 也就是说预加载脚本和启动脚本都被执行了,且预加载脚本是在启动脚本之前执行的。

接下来我们来验证一下根目录是否被设置为./server以及etc是否有挂载在根目录下。

在控制台上敲一句'get_system_info(),这里的'用于控制台上的快捷打印,get_system_info()可以返回driver现在的一些信息。查看输出中的root_pathmount_info即可。进一步验证etc是否成功挂载成根目录下的etc_m可以在控制台上敲一下下面这句话。

'file.exist("/etc_m/test.txt")

现在我们已经对启动参数以及简单的项目结构有一个整体的认知了,并且能对shell进行操作,接下来看看shell上的常用方法吧。

shell常用方法

  • man 用于查看函数说明
    比如想查看array相关的函数,这时可以在控制台敲man("array") 或者敲man array, 两种写法是等价的(但在telnet时只能用前者)。可以看到函数的属性(包括定义在c++中还是定义在script中,是static函数还是member函数),参数列表以及描述。

  • cls 用于清空屏幕

  • || . 用于退出driver

  • monkey.patch(program_name)monkey.patch("代码文件路径")

    • 可以尝试通过handle.get_all("program")查询当前有哪些program
    • 然后通过monkey.patch(program_name)去热更新
    • update()也可以用于热更新, 但是实现原理不太相同, update的逻辑更简单compile → destruct_object → load_static,但是对于有状态的对象,成员变量无法恢复,无法进行热更新。monkey.patch更为通用。
  • find_object(handle|string name_or_id) 查找一个object

  • get_obj_var(object ob, string var_name) 查看某个object的私有变量

  • set_obj_var(object ob, string var_name, mixed val) 设置某个私有变量的值 避免添加一个set函数->patch->删除这个set函数->patch这样的工作

  • child_objects(string | object name) 某个对象的所有实例

  • 常规的输出操作为write("xxxx")printf("xxxxx")

    • 但是在shell中可以用'快捷打印'"xxx"

如何快速测试

在下一章中将会有很多需要测试的例子,快速测试并不需要写上面提到那种相对复杂的项目结构。下面介绍常用的两种方法,以如下这个简单的目录结构为例

sample-helloworld
├─test.gs
├─gs.exe

一. 使用启动参数启动
启动语句

gs.exe /r ./ /e /test.gs

二. 使用load_static
启动参数什么也不写,把driver启动起来
在控制台上敲

load_static("/test.gs", this_domain())

全部启动参数简介

选项/配置描述
选项
-c1启用命令行。
-c2启用命令行,并在启动完成前允许输入。
-d在指定端口启用调试器。
-e[q]设置虚拟机的启动脚本(如果设置了 'q' 则在完成后退出)。
-l设置日志文件名。
-o设置基础脚本(在启动脚本之前执行)。
-p设置 Telnet 端口。
-r设置虚拟机根目录。
-s设置默认线程池大小。
-sm设置 GC 静态工作线程数。
-w设置 Telnet 密码。
-wd设置工作目录。
-D声明一个定义。
-v打印版本信息。
配置
--bin-alloc使用二进制分配器。
--call-stack-size %d设置函数调用上下文的深度。
--enable-threads如果为 0,则禁用除并行调度器和主线程外的其他线程,禁止套接字守护进程和新线程创建;通常与 /s 0 一起使用。
--enable-color-error将错误输出消息设置为红色。
--enable-compiler-debug启用编译器调试,显示生成的汇编代码。
--enable-debugger [%d]::[%d]允许嵌入式调试器工作,可选调试器端口和状态(1 表示随机端口,1 或 0 表示启动时暂停)。
--enable-gc-log启用 GC 日志。
--enable-jit启用 JIT(0 表示禁用,1 表示 asmjit,2 表示 llvmjit)。
--enable-jit-debug启用 JIT 调试。
--enable-jit-log启用 JIT 日志。
--enable-multi-cpu使用多 CPU(可能导致性能下降)。
--enable-system-command启用 efun "system"(存在安全风险)。
--enable-coverage启用覆盖率统计。
--gc-count-upper-bound设置分配大小计数上限,0 表示无限制。
--gc changedset使用变更集进行次要 GC 标记。
--gc cardtable使用卡表进行次要 GC 标记。
--gc changedset+cardtable同时使用变更集和卡表进行次要 GC 标记。
--gc full仅使用完全 GC,不进行次要 GC。
--gc-force-full-gc启用强制完全 GC。
--gc-lms-cached设置每个 LMS 释放内存页时缓存的删除页大小(字节)。
--gc-global-cached设置所有 LMS 释放内存页时缓存的删除页大小(字节)。
--gc-gray-page-size设置灰色页中的单元数(0 表示不使用灰色页)。
--gc-max-dynamic-work-us设置动态工作线程的最大工作时间(微秒)。
--gc-max-dynamic-worker设置动态工作线程的最大数量。
--gc-max-ub-pool设置单元/块池的最大数量。
--gc-min-gc-interval设置 GC 间隔的最小时间(毫秒)。
--gc-quota-to-full-gc提示进行完全 GC(当旧单元大小超过限制时)。
--gc-quota-to-minor-gc提示进行次要 GC(当新单元大小超过限制时)。
--gc-max-quota-to-minor-gc限制次要 GC(当新单元大小超过限制时)。
--gc-stat-recycle在指定轮次后打印回收信息以进行调试。
--gc-time-to-long-live设置 GC 引用值的默认长期存活时间。
--gc-thread-threshold限制动态工作线程(当 GC 期间分配大小超过限制时)。
--ignore-inexist-import当导入文件缺失时不报编译错误。
--jit-mem-size设置 JIT 内存池保留大小(MB,默认:1024)。
--lcs-buf-size设置默认 LCS 缓冲区大小。
--no-internal-scripts启动时不加载内部脚本。
--mount挂载设备或路径(真实目录::挂载点)。
--max-coroutines设置调度器的最大协程数。
--max-device设置可打开的最大设备数。
--max-sync_object设置调度器的最大同步对象数。
--max-rudp设置最大 RUDP 连接数。
--max-socket设置最大套接字数。
--optimize设置优化选项,格式:opt1=0/1;opt2=0/1...(默认:eps_efun=1)。
--page-alloc使用页内存分配器。
--page-keep-committed保持所有页已提交。
--pause-startup-script等待某些操作完成后再执行启动脚本。
--publish启用某些功能以通过指定的 pmake 文件发布。
--publish-builder设置 pmake 构建器脚本。
--publish-loader设置 pmake 加载器脚本。
--quick-exit-on-windows在 Windows 上启用快速退出(通过 TerminateProcess,默认:true)。
--relinquish设置调度器的释放时间。
--require添加必需的插件,格式:--require plugin1;plugin2;...--require all
--root-password设置 os.reset_euid_to_root 的根密码。
--script-args设置脚本参数,格式:--script-args "args..."
--search-path设置打开设备的搜索路径,格式:path1;path2;path3...
--socket-coroutine设置套接字协程数。
--stack-size %d设置堆栈大小。
--treat-warning-as-error让编译器将警告视为错误。
--use-single-lms使用单一本地内存存储以节省内存。
--use-large-page使用大页(Intel 上为 2M 页大小)。
--with-malloc 1[xAll|xNonGC]在分配内存时执行额外的 malloc 操作。
--use-client-mode使用客户端模式。
--timer-scheduler设置 TimerScheduler 的值(level1_unit_num/level2_unit_num/max_timers)。
--parallel-scheduler设置 ParallelScheduler 的值(level1_unit_num/level2_unit_num/pool_size)。
--thread-scheduler设置 ThreadScheduler 的值(level1_unit_num/level2_unit_num/pool_size)。
--mixed-func-ret-check设置是否检查混合函数中的返回类型。
--disable-dump-window在 Windows 上禁用崩溃时的消息框窗口(默认:false)。
--default-full-dump在 Windows 上崩溃时自动完全转储(默认:false)。
--config加载配置文件作为启动设置。
--not-opt-write-back不优化写回堆栈变量。