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的参数里,直接运行就可以调试子进程的逻辑了。
clang代码中调试子程序的方法
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的参数里,直接运行就可以调试子进程的逻辑了。