如何找fmt.Println函数的系统调用

然后我通过 go tool compile -S main.go

不是很懂汇编,但是我看ppt里系统调用下面一行都有 SYSCALL 的指令,这边没有
我本意想找一下fmt.Println()系统调用,然后看https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86_64-64_bit 这里的表来对照一下
23
收起
正在回答
2回答
看一下我下面贴的调试流程~
最后是 syscall.Write
Xargin
2021-06-08 21:49:23
~ ❯❯❯ dlv debug print.go
Type 'help' for list of commands.
(dlv) b main.main
Breakpoint 1 set at 0x10c622f for main.main() ./print.go:5
(dlv) c
> main.main() ./print.go:5 (hits goroutine(1):1 total:1) (PC: 0x10c622f)
1: package main
2:
3: import "fmt"
4:
=> 5: func main() {
6: fmt.Println("hello world")
7: }
(dlv) n
> main.main() ./print.go:6 (PC: 0x10c623d)
1: package main
2:
3: import "fmt"
4:
5: func main() {
=> 6: fmt.Println("hello world")
7: }
(dlv) s
> fmt.Println() /usr/local/go/src/fmt/print.go:273 (PC: 0x10c03c3)
268: }
269:
270: // Println formats using the default formats for its operands and writes to standard output.
271: // Spaces are always added between operands and a newline is appended.
272: // It returns the number of bytes written and any write error encountered.
=> 273: func Println(a ...interface{}) (n int, err error) {
274: return Fprintln(os.Stdout, a...)
275: }
276:
277: // Sprintln formats using the default formats for its operands and returns the resulting string.
278: // Spaces are always added between operands and a newline is appended.
(dlv) s
> fmt.Println() /usr/local/go/src/fmt/print.go:274 (PC: 0x10c03e8)
269:
270: // Println formats using the default formats for its operands and writes to standard output.
271: // Spaces are always added between operands and a newline is appended.
272: // It returns the number of bytes written and any write error encountered.
273: func Println(a ...interface{}) (n int, err error) {
=> 274: return Fprintln(os.Stdout, a...)
275: }
276:
277: // Sprintln formats using the default formats for its operands and returns the resulting string.
278: // Spaces are always added between operands and a newline is appended.
279: func Sprintln(a ...interface{}) string {
(dlv) s
> fmt.Fprintln() /usr/local/go/src/fmt/print.go:262 (PC: 0x10c0283)
=> 262: func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
263: p := newPrinter()
264: p.doPrintln(a)
265: n, err = w.Write(p.buf)
266: p.free()
267: return
(dlv) n
> fmt.Fprintln() /usr/local/go/src/fmt/print.go:263 (PC: 0x10c02a8)
262: func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
=> 263: p := newPrinter()
264: p.doPrintln(a)
265: n, err = w.Write(p.buf)
266: p.free()
267: return
268: }
(dlv) n
> fmt.Fprintln() /usr/local/go/src/fmt/print.go:264 (PC: 0x10c02b6)
262: func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
263: p := newPrinter()
=> 264: p.doPrintln(a)
265: n, err = w.Write(p.buf)
266: p.free()
267: return
268: }
269:
(dlv) n
> fmt.Fprintln() /usr/local/go/src/fmt/print.go:265 (PC: 0x10c02e6).
262: func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
263: p := newPrinter()
264: p.doPrintln(a)
=> 265: n, err = w.Write(p.buf)
266: p.free()
267: return
268: }
269:
270: // Println formats using the default formats for its operands and writes to standard output.
(dlv) s
> os.(*File).Write() /usr/local/go/src/os/file.go:149 (PC: 0x10b74c3)
144: }
145:
146: // Write writes len(b) bytes to the File.
147: // It returns the number of bytes written and an error, if any.
148: // Write returns a non-nil error when n != len(b).
=> 149: func (f *File) Write(b []byte) (n int, err error) {
150: if err := f.checkValid("write"); err != nil {
151: return 0, err
152: }
153: n, e := f.write(b)
154: if n < 0 {
(dlv) bt
0 0x00000000010b74c3 in os.(*File).Write
at /usr/local/go/src/os/file.go:149
1 0x00000000010c033a in fmt.Fprintln
at /usr/local/go/src/fmt/print.go:265
2 0x00000000010c0433 in fmt.Println
at /usr/local/go/src/fmt/print.go:274
3 0x00000000010c629f in main.main
at ./print.go:6
4 0x0000000001036598 in runtime.main
at /usr/local/go/src/runtime/proc.go:203
5 0x0000000001064211 in runtime.goexit
at /usr/local/go/src/runtime/asm_amd64.s:1373
(dlv) n
> os.(*File).Write() /usr/local/go/src/os/file.go:150 (PC: 0x10b74e8)
145:
146: // Write writes len(b) bytes to the File.
147: // It returns the number of bytes written and an error, if any.
148: // Write returns a non-nil error when n != len(b).
149: func (f *File) Write(b []byte) (n int, err error) {
=> 150: if err := f.checkValid("write"); err != nil {
151: return 0, err
152: }
153: n, e := f.write(b)
154: if n < 0 {
155: n = 0
(dlv) n
> os.(*File).Write() /usr/local/go/src/os/file.go:153 (PC: 0x10b7559)
148: // Write returns a non-nil error when n != len(b).
149: func (f *File) Write(b []byte) (n int, err error) {
150: if err := f.checkValid("write"); err != nil {
151: return 0, err
152: }
=> 153: n, e := f.write(b)
154: if n < 0 {
155: n = 0
156: }
157: if n != len(b) {
158: err = io.ErrShortWrite
(dlv) s
> os.(*File).write() /usr/local/go/src/os/file_unix.go:279 (PC: 0x10b8ab3)
274: return n, err
275: }
276:
277: // write writes len(b) bytes to the File.
278: // It returns the number of bytes written and an error, if any.
=> 279: func (f *File) write(b []byte) (n int, err error) {
280: n, err = f.pfd.Write(b)
281: runtime.KeepAlive(f)
282: return n, err
283: }
284:
(dlv) n
> os.(*File).write() /usr/local/go/src/os/file_unix.go:280 (PC: 0x10b8ad8)
275: }
276:
277: // write writes len(b) bytes to the File.
278: // It returns the number of bytes written and an error, if any.
279: func (f *File) write(b []byte) (n int, err error) {
=> 280: n, err = f.pfd.Write(b)
281: runtime.KeepAlive(f)
282: return n, err
283: }
284:
285: // pwrite writes len(b) bytes to the File starting at byte offset off.
(dlv) s
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:254 (PC: 0x10b4d8b)
249: return n, oobn, flags, sa, err
250: }
251: }
252:
253: // Write implements io.Writer.
=> 254: func (fd *FD) Write(p []byte) (int, error) {
255: if err := fd.writeLock(); err != nil {
256: return 0, err
257: }
258: defer fd.writeUnlock()
259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:255 (PC: 0x10b4db9)
250: }
251: }
252:
253: // Write implements io.Writer.
254: func (fd *FD) Write(p []byte) (int, error) {
=> 255: if err := fd.writeLock(); err != nil {
256: return 0, err
257: }
258: defer fd.writeUnlock()
259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
260: return 0, err
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:258 (PC: 0x10b4e2d)
253: // Write implements io.Writer.
254: func (fd *FD) Write(p []byte) (int, error) {
255: if err := fd.writeLock(); err != nil {
256: return 0, err
257: }
=> 258: defer fd.writeUnlock()
259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
260: return 0, err
261: }
262: var nn int
263: for {
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:259 (PC: 0x10b4e6c)
254: func (fd *FD) Write(p []byte) (int, error) {
255: if err := fd.writeLock(); err != nil {
256: return 0, err
257: }
258: defer fd.writeUnlock()
=> 259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
260: return 0, err
261: }
262: var nn int
263: for {
264: max := len(p)
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:262 (PC: 0x10b4f11)
257: }
258: defer fd.writeUnlock()
259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
260: return 0, err
261: }
=> 262: var nn int
263: for {
264: max := len(p)
265: if fd.IsStream && max-nn > maxRW {
266: max = nn + maxRW
267: }
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:263 (PC: 0x10b4f1a)
258: defer fd.writeUnlock()
259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
260: return 0, err
261: }
262: var nn int
=> 263: for {
264: max := len(p)
265: if fd.IsStream && max-nn > maxRW {
266: max = nn + maxRW
267: }
268: n, err := syscall.Write(fd.Sysfd, p[nn:max])
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:264 (PC: 0x10b4f1c)
259: if err := fd.pd.prepareWrite(fd.isFile); err != nil {
260: return 0, err
261: }
262: var nn int
263: for {
=> 264: max := len(p)
265: if fd.IsStream && max-nn > maxRW {
266: max = nn + maxRW
267: }
268: n, err := syscall.Write(fd.Sysfd, p[nn:max])
269: if n > 0 {
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:265 (PC: 0x10b4f2b)
260: return 0, err
261: }
262: var nn int
263: for {
264: max := len(p)
=> 265: if fd.IsStream && max-nn > maxRW {
266: max = nn + maxRW
267: }
268: n, err := syscall.Write(fd.Sysfd, p[nn:max])
269: if n > 0 {
270: nn += n
(dlv) n
> internal/poll.(*FD).Write() /usr/local/go/src/internal/poll/fd_unix.go:268 (PC: 0x10b52aa)
263: for {
264: max := len(p)
265: if fd.IsStream && max-nn > maxRW {
266: max = nn + maxRW
267: }
=> 268: n, err := syscall.Write(fd.Sysfd, p[nn:max])
269: if n > 0 {
270: nn += n
271: }
272: if nn == len(p) {
273: return nn, err
(dlv)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星