clang代码中调试子程序的方法

2024-01-11 14:17:36
标签: clang awk debug sed

clang /Users/conanchen/hello.c用这样的方法来编译源文件的时候,clang内部会重新调用一次clang子程序,并且给出一串参数。

在Mac上调试一个未启动程序可以用wait的方法等待。

但问题是当前调试的正是clang,这个方法会因为当前有同样的程序在运行而失效。Windiows上有对应的插件和方法来解决,Mac当然也可以做类似的,

一直等待,查找和当前进程不相同的clang时,去attach,但是不那么直接。

为了解决这个问题,直接在clang启动新进程的地方打断点,把参数Trace出来,然后单独列成参数来启动新的clang。

具体代码在/Users/conanchen/llvm-project/clang/lib/Driver/Job.cpp

intCommand::Execute(ArrayRef<</span>std::optional<</span>StringRef>> Redirects,

                     std::string *ErrMsg, bool *ExecutionFailed) const {

  PrintFileNames();

  SmallVector<<span>const char *, 128> Argv;

  if (ResponseFile == nullptr) {

    Argv.push_back(Executable);

    if (PrependArg)

      Argv.push_back(PrependArg);

    Argv.append(Arguments.begin(), Arguments.end());

    Argv.push_back(nullptr);

Argv里面就是我们需要的内容,第一个参数是当前clang进程的路径,我们可以不需要。

[1] = 0x000000010b7efeef "-cc1"

[2] = 0x000000010bd17b95 "-triple"

[3] = 0x00006000004ecf40 "arm64-apple-macosx14.0.0"

[4] = 0x000000010bd1cd0c "-Wundef-prefix=TARGET_OS_"

[5] = 0x000000010bd1cd26 "-Werror=undef-prefix"

[6] = 0x000000010bd1cd3b "-Wdeprecated-objc-isa-usage"

[7] = 0x000000010bd1cd57 "-Werror=deprecated-objc-isa-usage"

[8] = 0x000000010bd17d11 "-emit-obj"

[9] = 0x000000010bd19a3f "-mrelax-all"

[10] = 0x0000600000aec3a0 "-dumpdir"

[11] = 0x0000600000ad80d0 "a-"

[12] = 0x000000010bd1800f "-disable-free"

[13] = 0x000000010bd1801d "-clear-ast-before-backend"

[14] = 0x000000010bd1384c "-main-file-name"

[15] = 0x0000600000aec3d0 "hello.c"

[16] = 0x000000010bd181e1 "-mrelocation-model"

[17] = 0x000000010b7ef369 "pic"

[18] = 0x000000010bd181f4 "-pic-level"

[19] = 0x000000010b99221a "2"

[20] = 0x000000010bd183c5 "-mframe-pointer=non-leaf"

[21] = 0x0000600000aec400 "-ffp-contract=on"

[22] = 0x0000600000aec430 "-fno-rounding-math"

[23] = 0x000000010bd1850c "-funwind-tables=1"

[24] = 0x000000010bd1d24b "-fcompatibility-qualified-id-block-type-checking"

[25] = 0x000000010bd1d27c "-fvisibility-inlines-hidden-static-local-var"

[26] = 0x000000010bd16222 "-target-cpu"

[27] = 0x0000600000aec460 "apple-m1"

[28] = 0x000000010bc877f9 "-target-feature"

[29] = 0x000000010b824955 "+v8.5a"

[30] = 0x000000010bc877f9 "-target-feature"

[31] = 0x000000010bba49b7 "+aes"

[32] = 0x000000010bc877f9 "-target-feature"

[33] = 0x000000010bba49fe "+crc"

[34] = 0x000000010bc877f9 "-target-feature"

[35] = 0x000000010bba4a44 "+dotprod"

[36] = 0x000000010bc877f9 "-target-feature"

[37] = 0x000000010bba4b3d "+fp-armv8"

[38] = 0x000000010bc877f9 "-target-feature"

[39] = 0x000000010bba4b7f "+fp16fml"

[40] = 0x000000010bc877f9 "-target-feature"

[41] = 0x000000010bba4c23 "+lse"

[42] = 0x000000010bc877f9 "-target-feature"

[43] = 0x000000010bba4cd4 "+ras"

[44] = 0x000000010bc877f9 "-target-feature"

[45] = 0x000000010bba4cec "+rcpc"

[46] = 0x000000010bc877f9 "-target-feature"

[47] = 0x000000010bba4d0c "+rdm"

[48] = 0x000000010bc877f9 "-target-feature"

[49] = 0x000000010bba4d45 "+sha2"

[50] = 0x000000010bc877f9 "-target-feature"

[51] = 0x000000010bba4d67 "+sha3"

[52] = 0x000000010bc877f9 "-target-feature"

[53] = 0x000000010bba4d8f "+neon"

[54] = 0x000000010bc877f9 "-target-feature"

[55] = 0x000000010bd168b6 "+zcm"

[56] = 0x000000010bc877f9 "-target-feature"

[57] = 0x000000010bd168bb "+zcz"

[58] = 0x000000010bc877f9 "-target-feature"

[59] = 0x000000010bba4b51 "+fullfp16"

[60] = 0x000000010bd17720 "-target-abi"

[61] = 0x000000010bbebc1e "darwinpcs"

[62] = 0x000000010bd1b13d "-debugger-tuning=lldb"

[63] = 0x000000010bd1856c "-target-linker-version"

[64] = 0x0000600000adfe30 "1022.1"

[65] = 0x00006000027f40f0 "-fcoverage-compilation-dir=/Users/conanchen/llvm-project/build/Debug/bin"

[66] = 0x000000010bd13afa "-resource-dir"

[67] = 0x00006000011ea180 "/Users/conanchen/llvm-project/build/Debug/lib/clang/17"

[68] = 0x000000010bd13aea "-isysroot"

[69] = 0x00006000020ec000 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"

[70] = 0x000000010bd13a84 "-internal-isystem"

[71] = 0x0000600002af0180 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"

[72] = 0x000000010bd13a84 "-internal-isystem"

[73] = 0x00006000011ec180 "/Users/conanchen/llvm-project/build/Debug/lib/clang/17/include"

[74] = 0x000000010bd13aa3 "-internal-externc-isystem"

[75] = 0x0000600002ff4000 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include"

[76] = 0x00006000027f4140 "-fdebug-compilation-dir=/Users/conanchen/llvm-project/build/Debug/bin"

[77] = 0x000000010bd187d7 "-ferror-limit"

[78] = 0x000000010bc605e0 "19"

[79] = 0x000000010bd193a1 "-stack-protector"

[80] = 0x0000600000aec580 "1"

[81] = 0x000000010bd18bff "-fblocks"

[82] = 0x000000010bd18c22 "-fencode-extended-block-signature"

[83] = 0x000000010bd18c68 "-fregister-global-dtors-with-atexit"

[84] = 0x0000600000aec5e0 "-fgnuc-version=4.2.1"

[85] = 0x0000600000aec610 "-fmax-type-align=16"

[86] = 0x000000010bd1af41 "-fcolor-diagnostics"

[87] = 0x000000010bd192de "-D__GCC_HAVE_DWARF2_CFI_ASM=1"

[88] = 0x000000010bb8e1a1 "-o"

[89] = 0x00006000011ec140 "/var/folders/ly/fvmqqwtn5vb_7l_9f_pnbzh00000gn/T/hello-910408.o"

[90] = 0x000000010bd17aa8 "-x"

[91] = 0x000000010b7f3a75 "c"

[92] = 0x000000016fdfe93c "/Users/conanchen/hello.c"

然后把它存成文件,关键的来了

运行

cat clang_parameter.ini | awk '{ print $4 }' | sed 's/\"//g'

就能得到处理过后的结果

然后贴进XCode的参数里,直接运行就可以调试子进程的逻辑了。


阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有