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

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

http://img1.sycdn.imooc.com//climg/60bf6b5709a3a42003900232.jpg

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

http://img1.sycdn.imooc.com//climg/60bf6b9109e9c37312360521.jpg

不是很懂汇编,但是我看ppt里系统调用下面一行都有 SYSCALL 的指令,这边没有

我本意想找一下fmt.Println()系统调用,然后看https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86_64-64_bit 这里的表来对照一下

正在回答

登陆购买课程后可参与讨论,去登陆

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 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师